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() 的解释。 感谢以下两个重要的优化,使我们的异步函数更快了:
最重要的是,我们通过零成本的异步堆栈跟踪改进了开发体验,这些跟踪在异步函数的 await 和 Promise.all() 中运行。 我们还为 JavaScript 开发人员提供了一些很好的性能建议:
|
Powered by Discuz! X3.4
© 2001-2023 Discuz! Team.