← 返回目录

第 16 卷

第 16 / 19 卷日期:

14 15// 优化后:Promise链式调用

16const fs = require("fs/promises"); // 原生返回Promise的fs模块(无需手动Promise化)

17 18fs.readFile("file1.txt", "utf8")

19.then((data1) => {

20return fs.readFile("file2.txt", "utf8").then((data2) => {
21//传递前序数据:通过返回对象携带多个数据
22return { data1, data2 };
23});
24})
25.then(({ data1, data2 }) => {
26return fs.readFile("file3.txt", "utf8").then((data3) => {
27console.log(data1 + data2 + data3);
28});
29})
30.catch((err) => {
31console.error("统一处理错误:", err); //捕获所有环节的错误
32});

• 优点:嵌套转线性,可读性大幅提升;错误处理统一,避免遗漏;支持并行/串行控制(如

Promise.all());

  • 缺点:链式调用过长时,仍存在“then链”冗余;数据传递需要通过返回值携带,略显繁琐。

(3)方案3:Generator + Promise + 自动执行器

Generator函数( function*)支持通过 yield 关键字暂停执行,等待Promise完成后恢复。结合自动执行器(如 co 库),可实现异步逻辑的“同步化”书写,彻底消除嵌套和链式调用。

Code block

1 2// 优化后:Generator + Promise + co库

3const co = require("co");

4const fs = require("fs/promises");

5 6// Generator函数:异步逻辑同步化书写

7function* asyncTask() { 8try {

9// yield暂停,等待Promise完成后返回结果

16} 17}

18 19// co库自动执行Generator函数

20co(asyncTask());

  • 优点:异步逻辑完全同步化,代码最简洁;错误处理直观( try/catch);

• 缺点:需要依赖第三方自动执行器(如 co);Generator函数理解成本较高;已被async/await替

代。

(4)方案4:async/await(最优方案)

async/await是ES2017引入的语法糖,基于Promise和Generator实现,内置自动执行器,无需依赖第三方库。通过 async 定义异步函数, await 暂停函数执行等待Promise完成,实现异步逻辑的同步

化书写,是解决回调地狱的最优方案。

Code block

1 2// 优化后:async/await(最优方案)

3const fs = require("fs/promises");

4 5// async定义异步函数

6async function asyncReadFile() { 7try {

8// await暂停,等待Promise完成后返回结果
9const data1 = await fs.readFile("file1.txt", "utf8");
10const data2 = await fs.readFile("file2.txt", "utf8");
11const data3 = await fs.readFile("file3.txt", "utf8");
12console.log(data1 + data2 + data3);
13} catch (err) {
14console.error("统一处理错误:", err); //直接用try/catch捕获所有错误
15}
16 }

17 18// 调用异步函数

19asyncReadFile();

  • 优点:代码结构与同步代码完全一致,可读性和可维护性最优;错误处理直观( try/catch);

• 缺点:仅支持ES2017及以上环境,旧环境需通过Babel转译;本质基于Promise,需理解Promise

(5)方案5:使用async库等第三方工具(早期方案)

在Promise和async/await普及前,可使用 async 库(如 async.series、 async.waterfall)等第三方工具封装回调逻辑,实现串行/并行控制,避免嵌套。

  1. 什么是Promise?引入Promise的原因是什么?

(1)Promise的定义

Promise是ES6引入的一种异步编程规范/对象,用于封装和管理异步操作的最终状态(成功/失败)及结果。它代表了一个异步操作的“承诺”:承诺在未来某个时间点会完成,并返回操作结果(成功时

的结果或失败时的原因)。

Promise有三个不可逆转的状态,状态一旦改变就会永久保持:

  1. pending(进行中):初始状态,异步操作尚未完成;
  2. fulfilled(已成功):异步操作完成,Promise会回调成功函数( then 中的第一个参数);
  3. rejected(已失败):异步操作出错,Promise会回调失败函数( then 中的第二个参数或

catch)。

Promise的核心API包括:

• new Promise((resolve, reject) => {}):创建Promise实例,传入的执行器函数接收

两个参数⸺ resolve(成功时调用,将状态转为fulfilled并传递结果)和 reject(失败时调用,将状态转为rejected并传递错误原因);

• promise.then(onFulfilled, onRejected):注册状态改变后的回调函数,返回新的

Promise,支持链式调用;

• promise.catch(onRejected):专门注册失败回调,等价于 then(null,

onRejected),可捕获链式调用中任意环节的错误;

  • Promise.resolve(value):快速创建一个已成功的Promise;
  • Promise.reject(reason):快速创建一个已失败的Promise;

• Promise.all(iterable)、 Promise.race(iterable) 等:用于控制多个异步操作的并

行/竞争执行。

Code block

全站分卷索引 · 19 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷