function asyncRequest1() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Result of request 1');
}, 1000);
});
}
function asyncRequest2() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Result of request 2');
}, 1000);
});
}
function asyncRequest3() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Result of request 3');
}, 1000);
});
}
function* requestGenerator() {
const result1 = yield asyncRequest1();
const result2 = yield asyncRequest2();
const result3 = yield asyncRequest3();
return [result1, result2, result3];
}
function runGenerator(generator) {
const gen = generator();
function step(result) {
let { value, done } = gen.next(result);
if (done) {
return Promise.resolve(value);
}
return Promise.resolve(value).then(step);
}
return step();
}
runGenerator(requestGenerator).then((results) => {
console.log(results);
});
生成器函数与 Promise 配合解释
- 生成器函数暂停执行:生成器函数
requestGenerator
使用yield
关键字暂停执行,并返回一个Promise
对象。例如yield asyncRequest1()
,这里asyncRequest1()
返回一个Promise
,生成器函数暂停,等待这个Promise
被解决。
Promise
解决后恢复生成器:在runGenerator
函数中,通过Promise.resolve(value).then(step)
,当Promise
解决(resolved
)后,将Promise
的结果作为参数传递给生成器的next
方法,恢复生成器函数的执行。
- 依次执行请求:每次生成器恢复执行后,遇到下一个
yield
又会暂停,等待下一个Promise
解决,如此循环,从而实现了依次发起异步请求。
- 汇总结果:当所有
yield
的Promise
都解决后,生成器函数执行完毕,return
返回汇总的结果,runGenerator
函数返回的Promise
也随之解决,得到最终汇总的结果。