异步机制、迭代器、Generator和原型链四者的头脑风暴
JavaScript异步与迭代机制的核心要点 异步处理:通过事件循环(宏任务/微任务)解决单线程阻塞问题,Promise和async/await是主要工具,实现任务发起与结果获取的解耦。 迭代机制: 迭代器协议(.next()方法)标准化数据遍历 Generator函数实现可暂停执行,自动符合迭代器协议 异步Generator结合Promise,支持分步产出异步数据 底层支撑:原型链是这些特性的基
·
1. 异步(Promise / async/await / Event Loop)
-
问题:JS 单线程 → 一次只能干一件事 → 如果等 IO,线程就卡死。
-
解决:用 事件循环把任务分组(宏任务/微任务),让“等的事情”后台处理,等结果回来再继续。
-
工具:
-
Promise:包装未来结果,三种状态(pending → fulfilled/rejected)。
.then
/.catch
/.finally
。- 静态方法:
all
、race
、allSettled
、any
等。
-
async/await:Promise 的语法糖,让异步写法像同步。
-
异步的核心:解耦“发起任务” 和 “得到结果”。
2. 迭代器(Iterator) & 可迭代对象(Iterable)
- 迭代器:对象有
.next()
方法 → 每次返回{value, done}
。 - 可迭代对象:对象实现了
[Symbol.iterator]()
→ 返回迭代器。 - 常见可迭代对象:数组、字符串、Set、Map。
- 用途:
for...of
、解构、展开运算符,都依赖迭代器协议。
迭代器的核心:标准化“一个个取数据”的过程。
3. Generator
- 特殊函数:用
function*
定义,里面有yield
。 - 调用 Generator 函数不会立刻执行,而是返回一个 迭代器。
yield
是“暂停点”,next()
是“继续”。- 可以写异步流程(早期配合
co
库使用)。
Generator 的核心:函数可以分段执行 + 自动实现迭代器协议。
4. 异步 Generator
async function*
定义。- 每次
yield
的值会被包装成 Promise。 - 只能用
for await...of
来遍历。 - 场景:分页请求、流式读取文件、WebSocket 消息。
异步 Generator 的核心:能分段产出异步结果。
5. 原型 & 原型链
- 函数的 prototype 属性:决定
new
出来的对象的父亲是谁。 - 对象的 __proto__(内部 [[Prototype]]):指向它的父亲。
- 原型链:属性/方法查找机制,沿着 __proto__ 向上找,直到
Object.prototype
。 - instanceof 原理:检查构造函数的 prototype 是否在对象的原型链上。
原型的核心:JS 用链式继承来共享方法和属性。
现在我们来串起来:
-
迭代器协议 是 Generator 的基础
- Generator 函数返回的对象,天然就是迭代器(实现了
.next()
)。 - 所以
for...of
可以直接用在 Generator 上。
- Generator 函数返回的对象,天然就是迭代器(实现了
-
Generator 与 异步 的联系
yield
可以暂停/恢复 → 很适合写“异步流程”。async/await
就是对“Promise + Generator”模式的语法糖。
-
异步 Generator
- 把异步和 Generator 融合 → 每次产出的值是 Promise。
- 用于 逐步消费异步数据(比如网络流)。
-
Promise / async-await 与 事件循环
Promise.then
放在 微任务队列。setTimeout
放在 宏任务队列。- 所以输出顺序不同(
Promise.then
一定比setTimeout
先)。
-
原型链与这些对象的底层实现
-
所有迭代器、Promise、Generator 对象,本质都是普通对象,只不过它们继承了一套内置的原型:
- 数组迭代器继承自
%ArrayIteratorPrototype%
。 - Generator 对象继承自
%GeneratorPrototype%
。 - Promise 对象继承自
Promise.prototype
。
- 数组迭代器继承自
-
换句话说:原型链是它们的底层支撑结构。
-
最终关系图
JS 异步体系
├─ Event Loop(调度任务)
│ ├─ 宏任务:setTimeout, setInterval
│ └─ 微任务:Promise.then, queueMicrotask
│
├─ Promise(未来值容器)
│ └─ async/await(Promise语法糖)
│
├─ Generator(分段执行函数)
│ └─ 异步 Generator(Promise + Generator)
│
├─ Iterator(协议:.next() {value, done})
│ └─ Generator 天然实现
│
└─ Prototype Chain(所有对象的继承底层)
└─ Promise.prototype / GeneratorPrototype / IteratorPrototype
一句话串联:
- 迭代器 规定了遍历协议;
- Generator 用
yield
实现了可迭代对象; - 异步 Generator 把 Promise 和 Generator 融合,能产出异步结果;
- Promise / async-await 用事件循环调度异步;
- 原型链 是这些对象的底层支撑,让它们能共享方法和行为。
更多推荐
所有评论(0)