async/await
在nodejs的8版本中可用。这是nodejs中首次出现线性代码,这很好。更早的文章声称,在v8 JavaScript引擎中带有try/catch
块的函数不会被优化。现在,async/await
需要try/catch
块来处理错误。因此,作为开发人员,如何保持相同的性能呢?
async/await
在nodejs的8版本中可用。这是nodejs中首次出现线性代码,这很好。更早的文章声称,在v8 JavaScript引擎中带有try/catch
块的函数不会被优化。现在,async/await
需要try/catch
块来处理错误。因此,作为开发人员,如何保持相同的性能呢?
try/catch
在 V8 5.3
(Node v7.x
及以上版本) 中的提交 9aac80f
中得到了 TurboFan 优化。这意味着历史上关于 try/catch
性能不佳的说法不再正确。
来自V8 博客帖子:
过去,V8 在优化 ES2015+ 中发现的语言特性方面存在困难。例如,将异常处理(即
try/catch/finally
)支持添加到 Crankshaft,即 V8 的经典优化编译器,从未变得可行。这意味着 V8 优化 ES6 特性(例如具有隐式 finally 子句的for...of
)的能力受到限制。Crankshaft 的限制以及将新语言特性添加到全代码生成器(V8 的基线编译器)中的整体复杂性,使得确保在 V8 中快速添加和优化新的 ES 特性变得困难。幸运的是,Ignition 和 TurboFan(V8 的新解释器和编译器管道)从一开始就设计支持整个 JavaScript 语言,包括高级控制流、异常处理和最近的 ES2015 中的
for...of
和解构。Ignition 和 TurboFan 架构的紧密集成使得快速添加新功能并快速、逐步地优化它们成为可能。
async
函数中使用try/catch
只是Promise .then
和.catch
方法的语法糖,因此性能取决于底层Promise实现。Bluebird 声称 具有比本地Promise实现更好的性能,因此理论上,如果Bluebird所声称的是真的,通过用Bluebird的Promise实现覆盖本地Promise实现,您将获得更好的try/catch
性能。const Promise = require("bluebird")
或global.Promise = require("bluebird")
以全局方式覆盖它。
但请注意,这可能会在未来发生变化,因为原始Promise实现是使用JavaScript编写的,但最近已经重新实现为C++,可以在bug#5343中跟踪到。
async/await
和try/catch
的性能问题,您并没有提供任何明确的信息。现在使用try/catch
的await
速度与以前相比有多快?或者与不使用async/await
,只使用promise和.catch()
编程相比如何?这才是真正回答问题的信息。 - jfriend00Bluebird
是 Promise
的用户实现。 - ponury-kostek
.catch()
了吗? - guest271314async/await
中使用.catch()
的具体模式是什么?(async() => { "use strict"; await abc })() .then(result => console.log("resolved:", result)) .catch(err => console.error("rejected:", err))
- guest271314await
语句的块中发生高级别拒绝,您必须使用try/catch
来捕获它。如果您不理解,请阅读有关await
和拒绝的内容。我不会在这里的评论中教育您。这类似于在promise链末尾使用.catch()
,但是当使用多个await
语句而不是promise链时,不能仅使用.catch()
来捕获更高级别的拒绝。 - jfriend00