Generator函数深度理解与异步应用
请详细解释JavaScript Generator函数的执行机制(iterable/iterator/next/yield),并说明如何用Generator实现异步流程控制。
回答
小字辈
function* gen() {
const a = yield 1;
console.log('a:', a);
const b = yield 2;
console.log('b:', b);
return 3;
}
const it = gen();
console.log(it.next());
console.log(it.next('x'));
console.log(it.next('y'));
function run(genFn) {
const it = genFn();
function handle(result) {
if (result.done) return Promise.resolve(result.value);
return Promise.resolve(result.value).then(
val => handle(it.next(val)),
err => handle(it.throw(err))
);
}
return handle(it.next());
}
run(function* () {
const data1 = yield fetch('/api/user').then(r => r.json());
const data2 = yield fetch(`/api/posts/${data1.id}`).then(r => r.json());
console.log(data2);
});
关键点:1)Generator函数返回遍历器对象;2)next()传参会成为上一个yield表达式的值;3)yield*委托给另一个Generator。