Asynchrone Funktionen geben Versprechen zurück, keine Werte
P粉464208937
P粉464208937 2023-10-19 18:54:01
0
2
456

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 {  }

Soweit ich weiß, soll „await“ blockierend sein, und im obigen Code scheint es die Verwendung des Grundelementstimestamp返回对象blzu 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粉464208937
P粉464208937

Antworte allen (2)
P粉099985373

异步前缀是 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) }) }
    P粉002023326

    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错误)都将被捕获并转换为拒绝。
      Neueste Downloads
      Mehr>
      Web-Effekte
      Quellcode der Website
      Website-Materialien
      Frontend-Vorlage
      Über uns Haftungsausschluss Sitemap
      Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!