Когда я пытаюсь отобразить данные json в параграфе в дескрипторах, я получаю [object Promise] вместо данных [duplicate]

Нижеприведенный сценарий пытается записать файл в течение 30 секунд и после этого сдаться. Мне это нужно, когда все наши пользователи должны были щелкнуть по сценарию. Скорее всего, несколько пользователей пытаются писать одновременно. OpenCSV () пытается открыть файл 30 раз с задержкой в ​​1 секунду.

  Const ForAppending = 8

  currentDate = Year(Now) & "-" & Month(Now) & "-" & Day(Now) & " " & Hour(Now) & ":" & Minute(Now) & ":" & Second(Now)
  filepath = "\\network\path\file.csv"
  Set oCSV = OpenCSV( filepath ) 
  oCSV.WriteLine( currentDate )
  oCSV.Close

  Function OpenCSV( path )
    Set oFS = CreateObject( "Scripting.FileSystemObject" )
    For i = 0 To 30
      On Error Resume Next
      Set oFile = oFS.OpenTextFile( path, ForAppending, True )
      If Not Err.Number = 70 Then
        Set OpenCSV = oFile
        Exit For
      End If
      On Error Goto 0
      Wscript.Sleep 1000
    Next
    Set oFS = Nothing
    Set oFile = Nothing
    If Err.Number = 70 Then
      MsgBox "File " & filepath & " is locked and timeout was exceeded.", vbCritical
      WScript.Quit
    End If
  End Function
64
задан Aerovistae 16 May 2017 в 21:36
поделиться

7 ответов

Функция

promiseA then возвращает новое обещание (promiseB), которое немедленно разрешается после разрешения promiseA, его значение является значением того, что возвращается из функции успеха в promiseA .

В этом случае promiseA разрешается со значением - result, а затем немедленно разрешает promiseB со значением result + 1.

Доступ к значению promiseB выполняется так же, как мы получили доступ к результату promiseA.

promiseB.then(function(result) {
    // here you can use the result of promiseB
});
55
ответ дан Aerovistae 17 August 2018 в 10:42
поделиться
  • 1
    Обещания теоретически являются их собственными объектами. они содержат результат, к которому можно получить доступ через функцию успеха обещания. – Nayish 8 April 2015 в 13:53
  • 2
    Поэтому, если вы хотите работать с возвращаемым значением асинхронного обратного вызова обещания, это должно быть сделано внутри другого асинхронного обратного вызова. Имеет смысл. Я искал способ получить некоторую конечную примитивную возвращаемую ценность, но я полагаю, что это будет игнорировать причину, учитывая контекст. – Aerovistae 8 April 2015 в 14:05
  • 3
    @Aerovistae на самом деле, ES6 представляет генераторы, которые делают это возможным, и ES7 вводит асинхронные функции - оба из которых дают вам синтаксический сахар над обещаниями, что делает его похожим на синхронный код (запустив конечный автомат в фоновом режиме) - так что держитесь за туго :) – Benjamin Gruenbaum 9 April 2015 в 08:56

Может быть, этот небольшой пример кода для скриптов поможет.

private getAccount(id: Id) : Account {
    let account = Account.empty();
    this.repository.get(id)
        .then(res => account = res)
        .catch(e => Notices.results(e));
    return account;
}

Здесь repository.get(id) возвращает Promise<Account>. Я назначаю его переменной account в инструкции then.

-2
ответ дан aahoogendoorn 17 August 2018 в 10:42
поделиться

.then функция promB получает то, что возвращается из функции .then из обещания.

здесь sacA возвращается, это число, которое будет доступно как параметр number в функции успеха promB , который затем будет увеличен на 1

2
ответ дан harishr 17 August 2018 в 10:42
поделиться

Разбор комментария немного отличается от вашего текущего понимания:

// promiseB will be resolved immediately after promiseA is resolved

Это означает, что promiseB является обещанием, но будет разрешен сразу после разрешения promiseA. Другой способ взглянуть на это означает, что promiseA.then() возвращает обещание, присвоенное promiseB.

// and its value will be the result of promiseA incremented by 1

Это означает, что значение, которое promiseA разрешено, является значением, которое promiseB получит в качестве своего успеха значение возврата:

promiseB.then(function (val) {
  // val is now promiseA's result + 1
});
0
ответ дан Jason Cust 17 August 2018 в 10:42
поделиться

Вы можете легко сделать это, используя метод ожидания async в javascript.

Ниже приведен пример получения значения обещания WebRTC с использованием тайм-аута.

function await_getipv4(timeout = 1000) {
    var t1 = new Date();
    while(!window.ipv4) {
        var stop = new Date() - t1 >= timeout;
        if(stop) {
            console.error('timeout exceeded for await_getipv4.');
            return false;
        }
    }
    return window.ipv4;
}

function async_getipv4() {
    var ipv4 = null;
    var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}})
    findIP.then(ip => window.ipv4 = ip);
    return await_getipv4();
};

0
ответ дан OxFEEDFACE 17 August 2018 в 10:42
поделиться
  • 1
    Очень важно запустить этот фрагмент не здесь, а в реальном браузере, я считаю, что это связано с песочницей. – OxFEEDFACE 28 July 2018 в 00:51

Когда обещание будет разрешено / отклонено, оно вызовет его обработчик успеха / ошибки:

var promiseB = promiseA.then(function(result) {
   // do something with result
});

Метод then также возвращает обещание: promB, которое будет разрешено / отклонено в зависимости от возвращаемое значение из обработчика успеха / ошибки из обещания.

Есть три возможных значения, которые могут быть возвращены обработчикам успеха / ошибок, которые повлияют на результат результата:

1. Return nothing --> PromiseB is resolved immediately, 
   and undefined is passed to the success handler of promiseB
2. Return a value --> PromiseB is resolved immediately,
   and the value is passed to the success handler of promiseB
3. Return a promise --> When resolved, promiseB will be resolved. 
   When rejected, promiseB will be rejected. The value passed to
   the promiseB's then handler will be the result of the promise

Вооружено это понимание, вы можете понять следующее:

promiseB = promiseA.then(function(result) {
  return result + 1;
});

Затем вызов немедленно возвращает обещаниеB. Когда обещание будет разрешено, оно передаст результат, чтобы обещать успешный обработчик. Поскольку возвращаемое значение является результатом promA + 1, обработчик успеха возвращает значение (вариант 2 выше), так что обещаниеB будет немедленно устранено, а обработчик успеха пообещания будет передан с обещанием результата + 1.

8
ответ дан pixelbits 17 August 2018 в 10:42
поделиться
promiseA(pram).then(
     result => { 
     //make sure promiseA function allready success and response
     //do something here
}).catch(err => console.log(err)) => {
     // handle error with try catch
}
0
ответ дан tomnyson 17 August 2018 в 10:42
поделиться
  • 1
    Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст в отношении how и why , он решает проблему, улучшив долгосрочную ценность ответа. – Alexander 18 June 2018 в 04:43
Другие вопросы по тегам:

Похожие вопросы: