家电维修网

 找回密码
 注册
家电维修网 网站首页 电工学习 查看内容

V8中更快的异步函数和promises

2018-12-1 12:41| 发布者: 南召修电视| 查看: 1342| 评论: 0

摘要: 原文作者:Maya Lekova and Benedikt Meurer 译者:UC 国际研发 Jothy写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与 ...
V8中更快的异步函数和promises


请注意,虽然对 foo() 的调用会导致错误,但 foo 并不是堆栈跟踪的一部分。 这让 JavaScript 开发者执行事后调试变得棘手,无论你的代码是部署在 Web 应用程序中还是云容器内部。

有趣的是,当 bar 完成时,引擎知道它该继续的位置:就在函数 foo 中的 await 之后。 巧的是,这也是函数 foo 被暂停的地方。 引擎可以使用此信息来重建异步堆栈跟踪的部分,即 await 点。 有了这个变更,输出变为:


在堆栈跟踪中,最顶层的函数首先出现,然后是同步堆栈跟踪的其余部分,然后是函数 foo 中对 bar 的异步调用。此变更在新的 --async-stack-traces 标志后面的 V8 中实现。


但是,假如将其与上面 Chrome DevTools 中的异步堆栈跟踪进行比较,你会注意到堆栈跟踪的异步部分中缺少 foo 的实际调用点。如前所述,这种方法利用了以下原理:await 恢复和暂停位置是相同的 - 但对于常规的 Promise#then() 或 Promise#catch()调用,情况并非如此。更多背景信息请参阅 Mathias Bynens 关于为什么 await 能打败 Promise#then() 的解释。



结论


感谢以下两个重要的优化,使我们的异步函数更快了:

  • 删除两个额外的 microticks;

  • 取消 throwaway promise;


最重要的是,我们通过零成本的异步堆栈跟踪改进了开发体验,这些跟踪在异步函数的 await 和 Promise.all() 中运行。


我们还为 JavaScript 开发人员提供了一些很好的性能建议:


  • 多用异步函数和 await 来替代手写的 promise;

  • 坚持使用 JavaScript 引擎提供的原生 promise 实现,避免 await 使用两个 microticks;


12345

最新评论

  • 三相电源断零线,为什么会接二连三烧坏电器
  • 风力发电机转那么慢,一圈能发多少电?
  • 零线不带电,为什么还要拉一条?直接用地做
  • 电磁阀基础知识详解:原理、维护、选型
  • 新能源汽车DC/DC变换器及实物拆机图

QQ|门户地图|网站地图|家电维修|手机版|家电维修技术论坛 ( 蜀ICP备14030498号-16 川公网安备51102502000162号 )

GMT+8, 2025-5-23 18:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部