原文作者:Maya Lekova and Benedikt Meurer 译者:UC 国际研发 Jothy
一直以来,JavaScript 的异步处理都因其速度不够快而名声在外。 更糟糕的是,调试实时 JavaScript 应用 - 特别是 Node.js 服务器 - 并非易事,特别是在涉及异步编程时。 幸好,这些正在发生改变。 本文探讨了我们如何在 V8(某种程度上也包括其他 JavaScript 引擎)中优化异步函数和 promise,并描述了我们如何提升异步代码的调试体验。 注意:假如你喜欢边看演讲边看文章,请欣赏下面的视频!假如不是,请跳过视频并继续阅读。 视频地址: https://www.youtube.com/watch?v=DFP5DKDQfOc >> 从回调(callback)到 promise 再到异步函数 << 在 JavaScript 还没实现 promise 之前,要解决异步的问题通常都得基于回调,尤其是在 Node.js 中。 举个例子🌰: 我们通常把这种使用深度嵌套回调的模式称为“回调地狱”,因为这种代码不易读取且难以维护。 所幸,现在 promise 已成为 JavaScript 的一部分,我们可以以一种更优雅和可维护的方式实现代码: 最近,JavaScript 还增加了对异步函数的支持。 我们现在可以用近似同步代码的方式实现上述异步代码: 使用异步函数后,虽然代码的执行仍然是异步的,但代码变得更加简洁,并且更易实现控制和数据流。(请注意,JavaScript 仍在单线程中执行,也就是说异步方法本身并没有创建物理线程。) >> 从事件监听回调到异步迭代 << 另一个在 Node.js 中特别常见的异步范式是 ReadableStreams。 请看例子: 这段代码有点难理解:传入的数据只能在回调代码块中处理,并且流 end 的信号也在回调内触发。 假如你没有意识到函数会立即终止,且得等到回调被触发才会进行实际处理,就很容易在这里写出 bug。 幸好,ES2018 的一项新的炫酷 feature——异步迭代,可以简化此代码: 我们不再将处理实际请求的逻辑放入两个不同的回调 - 'data' 和 ' end ' 回调中,相反,我们现在可以将所有内容放入单个异步函数中,并使用新的 for await...of 循环实现异步迭代了。 我们还添加了 try-catch 代码块以避免 unhandledRejection 问题[1]。 你现在已经可以正式使用这些新功能了! Node.js 8(V8 v6.2/Chrome 62)及以上版本已完全支持异步方法,而 Node.js 10(V8 v6.8/Chrome 68)及以上版本已完全支持异步迭代器(iterator)和生成器(generator)! 我们已经在 V8 v5.5(Chrome 55 和 Node.js 7)和 V8 v6.8(Chrome 68 和 Node.js 10)之间的版本显着提升了异步代码的性能。开发者可安全地使用新的编程范例,无需担心速度问题。 |
Powered by Discuz! X3.4
© 2001-2023 Discuz! Team.