首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么异步等待要比在一起运行时的承诺慢得多?

为什么异步等待要比在一起运行时的承诺慢得多?
EN

Stack Overflow用户
提问于 2017-11-11 10:47:26
回答 1查看 2.2K关注 0票数 7

我发现在某些情况下运行异步等待可能会慢得多。

代码语言:javascript
复制
<html>
  <script>
    function makeAPromise() {
      return Promise.resolve(Math.random());
    }

    function usingPromises() {
      const before = window.performance.now();
      return makeAPromise().then((num) => {
        const after = window.performance.now();
        console.log('Total (promises): ', after-before, 'ms');
        return num;
      })
    }

    async function usingAwait() {
      const before = window.performance.now();
      const num = await makeAPromise();
      const after = window.performance.now();
      console.log('Total (await): ', after-before, 'ms');
      return num;
    }

    function runBoth() {
      usingAwait();
      usingPromises();
    }
    
    runBoth();

  </script>

  <button onclick="usingPromises()">usingPromises</button>
  <button onclick="usingAwait()">usingAwait</button>
  <button onclick="runBoth()">both</button>
</html>

国际海事组织,console.log在usingPromises应该打印类似的结果在usingAwait。但在现实中,我得到:

总计(承诺):0.25毫秒 总计(待定):2.065毫秒

此外,在页面加载之后,如果单击“usingPromises”或“usingAwait”按钮,则每个按钮都会得到类似的结果。(单独跑步时两者都是快速的)

总计(承诺):0.060000000026775524毫秒 总计(待定):0.08999999999650754毫秒

但是,如果我点击“两种”按钮,“等待”版本比承诺版本慢3-4倍。

我有一个实际的应用程序运行了大量的承诺/异步-等待初始化函数,我发现将一些异步等待函数替换为“相等”的承诺版本可以节省大量的加载时间(~200 to )。

有人能解释一下为什么吗?异步等待是否也使用与承诺(微任务)相同的作业队列?什么时候应该使用承诺而不是异步等待,有最佳实践吗?

  • 运行在mac上的chrome 62上

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-11 11:11:41

当使用按钮Both运行时,您的第一个结果是误导的。承诺决议是在微任务事件队列中排序的:因此其中一个可以在另一个队列中使用console.log打印,但是console.log会给第二个任务带来额外的延迟,因为它发生在创建第二个承诺和处理其解析之间。

如果将runBoth定义为:

代码语言:javascript
复制
Promise.resolve().then(usingAwait).then(usingPromises)

现在,这两个承诺将在微任务中创建,而第一个承诺将在创建第二个承诺之前得到解决和处理。这将导致一个更公平的比较,在任何时间都不能测量console.log

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47237054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档