第 5 章 使用 Promises 和 Async/Await 异步控制流模式

回调是 Node.js 中异步编程的低级构建块,但它们对开发人员不友好。 事实上,在上一章中,我们学习了使用回调实现不同控制流结构的技术,我们可以说,与它们尝试完成的任务的(低)复杂性相比,它们相当复杂和冗长。 特别是,串行执行流是我们编写的大多数代码中的主要控制流结构,它很容易导致未经训练的开发人员编写受回调地狱问题影响的代码。 最重要的是,即使正确实现,串行执行流程似乎也不必要地复杂且容易出错。 我们还要记住回调的错误管理是多么脆弱; 如果我们忘记转发错误,那么它就会丢失,如果我们忘记捕获某些同步代码抛出的任何异常,那么程序就会崩溃。而且这一切都还没算上那个无时不在伺机而动的 Zalgo。

Node.js 和 JavaScript 多年来一直受到批评,因为它们缺乏针对如此常见和普遍存在的问题的原生解决方案。 幸运的是,多年来,社区一直在努力寻找新的解决方案来解决这个问题,最终,经过多次迭代、讨论和多年的等待,今天我们对 “回调问题” 有了一个合适的解决方案。

实现更好的异步代码体验的第一步是 Promise,它是一个 “承载” 异步操作的状态和最终结果的对象。 Promise 可以很容易地链接起来以实现串行执行流,并且可以像任何其他对象一样移动。 Promise 大大简化了异步代码; 然而,仍有改进的空间。 因此,为了使无处不在的串行执行流程尽可能简单,引入了一种新的构造,称为 async/await,它最终可以使异步代码看起来像同步代码。

在当今的现代 Node.js 编程中,async/await 是处理异步代码时首选使用的构造。 然而,async/await 是建立在 Promise 之上的,就像 Promise 是建立在回调之上一样。 因此,了解并掌握所有这些知识以便用正确的方法解决异步编程问题非常重要。

在本章中,您将学习以下内容:

  • Promise 如何工作以及如何有效地使用它们来实现我们已经了解的主要控制流结构。

  • async/await 语法,它将成为我们在 Node.js 中处理异步代码的主要工具。

在本章结束时,您将了解 JavaScript 中用于驯服异步代码的两个最重要的组件。 那么,让我们从发现 Promise 开始吧。