suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Asynchrone Funktionen geben Versprechen zurück, keine Werte

Ich versuche zu verstehen, wie Async/Await mit Promise funktioniert.

async function latestTime() {
  const bl = await web3.eth.getBlock('latest');
  console.log(bl.timestamp); // Returns a primitive
  console.log(typeof bl.timestamp.then == 'function'); //Returns false - not a promise
  return bl.timestamp;
}
const time = latestTime(); // Promise { <pending> }

Soweit ich weiß, soll „await“ blockierend sein, und im obigen Code scheint es die Verwendung des Grundelements timestamp 返回对象 bl zu verhindern. Meine Funktion gibt dann den ursprünglichen Wert zurück, aber die Zeitvariable wird auf das ausstehende Versprechen statt auf diesen ursprünglichen Wert gesetzt. Was habe ich verpasst?

P粉464208937P粉464208937406 Tage vor532

Antworte allen(2)Ich werde antworten

  • P粉099985373

    P粉0999853732023-10-20 14:57:49

    异步前缀是 Promises 的一种包装器。

    async function latestTime() {
        const bl = await web3.eth.getBlock('latest');
        console.log(bl.timestamp); // Returns a primitive
        console.log(typeof bl.timestamp.then == 'function'); //Returns false - not a promise
        return bl.timestamp;
    }

    与相同

    function latestTime() {
        return new Promise(function(resolve,success){
            const bl = web3.eth.getBlock('latest');
            bl.then(function(result){
                console.log(result.timestamp); // Returns a primitive
                console.log(typeof result.timestamp.then == 'function'); //Returns false - not a promise
                resolve(result.timestamp)
            })
    }

    Antwort
    0
  • P粉002023326

    P粉0020233262023-10-20 12:58:06

    async 函数始终返回一个 Promise。这就是它报告异步工作完成情况的方式。如果您在另一个async函数中使用它,则可以使用await来等待其promise解决,但在非async中函数(通常在顶层或在事件处理程序中),您必须直接使用 Promise,例如:

    latestTime()
    .then(time => {
        console.log(time);
    })
    .catch(error => {
        // Handle/report error
    });
    

    ...不过,如果您在 JavaScript 模块的顶层执行此操作,则所有现代环境现在都支持 模块中的顶级 await

    const time = await latestTime();

    (请注意,如果该 Promise 被拒绝,您的模块将无法加载。如果即使 Promise 失败您的模块也能有意义地工作,请务必将其包装在 try/catch 中 处理承诺拒绝。)


    可能(或可能不会)以显式承诺回调术语的形式揭示了一些事情,让我们了解 JavaScript 引擎如何在幕后处理您的 async 函数:

    function latestTime() {
        return new Promise((resolve, reject) => {
            web3.eth.getBlock('latest')
            .then(bl => {
                console.log(bl.timestamp);
                console.log(typeof bl.timestamp.then == 'function');
                resolve(bl.timestamp);
            })
            .catch(reject);
        });
    }
    

    一些重要的说明:

    • 您传递给 new Promise 的函数(promise 执行器函数)由 new Promise 同步调用。
      • 这就是操作开始的原因,同步调用web3.eth.getBlock来开始工作。
    • Promise 执行器中抛出的任何错误(等)都会被 new Promise 捕获并转换为 Promise 拒绝。
    • 在 Promise 回调中抛出的任何错误(例如我们传递的 then 错误)都将被捕获并转换为拒绝。

    Antwort
    0
  • StornierenAntwort