总结

在本章中,我们学习了如何使用 Promise 和 async/await 语法来编写更简洁、更清晰、更易于阅读的异步代码。

正如我们所看到的,promise 和 async/await 极大地简化了串行执行流程,这是最常用的控制流程。 事实上,使用 async/await,编写一系列异步操作几乎与编写同步代码一样简单。 借助 Promise.all() 实用程序,并行运行一些异步操作也非常容易。

但使用 Promise 和 async/await 的优势还不止于此。 我们了解到,它们为棘手的情况提供了透明的屏障,例如具有混合同步/异步行为的代码(又名 Zalgo,我们在第 3 章回调和事件中讨论过)。 最重要的是,使用 Promise 和 async/await 进行错误管理更加直观,并且产生错误的空间更少(例如忘记转发错误,这是使用回调的代码中错误的严重来源)。

在模式和技术方面,我们绝对应该牢记承诺链(串行运行任务)、承诺化和生产者-消费者模式。 另外,在将 Array.forEach() 与 async/await 一起使用时要注意(您可能做错了),并记住异步函数中简单返回和返回等待之间的区别。

回调在 Node.js 和 JavaScript 世界中仍然广泛使用。 我们在遗留 API、与本机库交互的代码中或者需要对特定例程进行微优化时找到它们。 这就是为什么它们仍然与我们 Node.js 开发人员相关; 然而,对于我们大多数日常编程任务来说,promise 和 async/await 比回调向前迈出了一大步,因此它们现在是 Node.js 中处理异步代码的事实上的标准。 这就是为什么我们将在本书的其余部分中使用 Promise 和 async/await 来编写异步代码。

在下一章中,我们将探讨另一个与异步代码执行相关的有趣主题,这也是整个 Node.js 生态系统中的另一个基本构建块,即流。