← 返回目录

第 17 卷

第 17 / 19 卷日期:

7resolve(`延迟${time}ms后成功`); //成功:状态转为fulfilled
8} else {
9reject(new Error("延迟时间不能为0或负数")); //失败:状态转为rejected
10}
11}, time);
12 });
13 };

14 15// 使用Promise

16delay(1000)

17.then((result) => {

18console.log(result); //输出:延迟1000ms后成功
19return delay(500); //链式调用,返回新的Promise
20})
21.then((result) => {
22console.log(result); //输出:延迟500ms后成功
23})
24.catch((err) => {
25console.error(err.message); //捕获所有环节的错误
26});

(2)引入Promise的原因

在Promise出现之前,JavaScript异步编程完全依赖回调函数,存在诸多致命问题。引入Promise的核心目的是解决传统回调函数的缺陷,优化异步编程体验,提升代码的可读性、可维护性和健壮性,具

体原因如下:

  1. 解决“回调地狱”问题:多个嵌套的异步操作会形成“金字塔”式的回调地狱,代码缩进过深、逻

辑混乱。Promise通过 then 链式调用,将嵌套的异步逻辑转为线性代码,彻底打破回调地狱的层级限制,让代码结构更清晰。

  1. 实现统一的错误处理:传统回调函数需要在每个嵌套层级单独处理错误,容易遗漏且代码冗余。

Promise通过 catch 方法可捕获链式调用中任意环节的错误,实现“一次捕获,全链覆盖”的统一错误处理机制,降低错误处理成本。

  1. 规范异步操作的流程控制:传统回调函数缺乏对多个异步操作的统一控制方案(如并行执行、顺序

执行、竞争执行)。Promise提供了 Promise.all()(等待所有异步操作完成)、 Promise.race()(等待第一个完成的异步操作)等静态方法,可便捷地实现复杂的异步流程

控制。

  1. 分离异步操作的发起与结果处理:Promise将异步操作的发起(封装在Promise内部)与结果处理
  1. 解释什么是生成器(Generator)以及它在异步编程中如何被利用?

(1)生成器(Generator)的定义

生成器(Generator)是ES6引入的一种特殊函数类型,用于控制函数的暂停和恢复执行,是实现“协作式多任务”的核心技术。其核心特征是:

  1. 函数定义时在 function 关键字后加 *(如 function* gen() {});
  2. 函数内部通过 yield 关键字暂停函数执行,并返回一个包含“暂停状态”和“yield后值”的迭代

器对象(Iterator Object);

  1. 通过调用迭代器的 next() 方法恢复函数执行, next() 的返回值是一个对象,包含 value

(yield表达式的结果)和 done(布尔值,标识函数是否执行完毕);

  1. 支持通过 throw() 方法向函数内部抛出错误,通过 return() 方法强制终止函数执行。

Code block

1 2// 生成器函数基础示例

3function* generatorDemo() { 4console.log("函数开始执行");

5const res1 = yield 1; //暂停执行,返回value=1,等待next()恢复
6console.log("第一次恢复执行,res1 =", res1);
7const res2 = yield 2; //再次暂停,返回value=2
8console.log("第二次恢复执行,res2 =", res2);
9return 3; //函数执行完毕,返回value=3,done=true
10};

11 12// 创建迭代器对象(生成器函数调用后不立即执行,仅返回迭代器)

13const iter = generatorDemo();

14 15// 调用next()恢复执行

16console.log(iter.next()); // { value: 1, done: false }→执行到第一个yield暂停
17console.log(iter.next("参数1")); //传入的"参数1"作为上一个yield的结果(res1)
18//输出:第一次恢复执行,res1 =参数1→{ value:

2, done: false } 19console.log(iter.next("参数2")); // 传入的"参数2"作为上一个yield的结果(res2)

20// 输出:第二次恢复执行,res2 = 参数2 → { value:

3, done: true } 21console.log(iter.next()); // { value: undefined, done: true } → 函数已执行完毕

与生成器的“暂停”特性结合,实现异步逻辑的“同步化”书写,解决回调地狱问题。其核心思路是:

将异步操作封装为Promise,在生成器函数内部通过yield暂停函数,等待Promise完成后,通过 next()方法恢复函数并传递Promise的结果。由于手动调用next()繁琐,实际开发中需配合“自动执行

器”(如co库)实现全自动化的暂停-恢复。

具体利用步骤:

  1. 将异步操作Promise化:把回调式异步函数(如文件读取、网络请求)封装为返回Promise的函

数;

  1. 在生成器函数内部,通过 yield 异步Promise 暂停函数,等待异步操作完成;
  2. 使用自动执行器(如co库):自动监听Promise的状态,当Promise成功时,调用 next(结果) 恢

复函数并传递异步结果;当Promise失败时,调用 throw(错误) 抛出错误;

  1. 通过 try/catch 捕获异步操作的错误,实现统一错误处理。

Code block

1

2//示例:生成器+ Promise + co库实现异步同步化
3const co = require("co"); //自动执行器库
4const fs = require("fs/promises"); // Promise化的文件读取模块

5 6// 1. 定义异步操作(已Promise化)

7const readFile = (path) => fs.readFile(path, "utf8");

8 9// 2. 生成器函数:异步逻辑同步化书写

10function* asyncTask() { 11try {

12// yield暂停,等待readFile的Promise完成
13const data1 = yield readFile("file1.txt");
14const data2 = yield readFile("file2.txt");
15const data3 = yield readFile("file3.txt");
16console.log("文件内容拼接:", data1 + data2 + data3);
17return "执行成功";
18} catch (err) {
19console.error("异步操作错误:", err.message); //统一捕获错误
20}
21};
全站分卷索引 · 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 卷