// 创建一个生成器
function* gen() {
let res = yield new Promise((resolve, reject) => {
setTimeout(() => {
resolve("结果1");
}, 1000);
});
console.log(res);
let res2 = yield new Promise((resolve, reject) => {
setTimeout(() => {
resolve("结果2");
}, 1000);
});
console.log(res2);
let res3 = yield "同步的结果3";
console.log(res3);
}
(function () {
// 创建迭代器
// 用以控制生成器的迭代
let iterator = gen();
const ite = iterator.next();
if (!ite.done) {
Async(iterator, ite.value);
}
// 对结果进行迭代处理
function Async(iterator, ite) {
if (ite instanceof Promise) {
ite.then((res) => {
let ite1 = iterator.next(res);
if (!ite1.done) {
if (!ite1.value instanceof Promise) {
} else {
Async(iterator, ite1.value);
}
}
});
} else {
let ite1 = iterator.next(ite);
if (!ite1.done) {
Async(iterator, ite1.value);
}
}
}
})();
代码思路
- gen函数 是一个生成器函数,函数内放异步代码 类似于 async 函数;yield是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字
- iterator 是一个迭代器 用于控制gen 函数的执行 并调用next方法 给yield返回一个值;
- Async 用于递归执行迭代器 执行yield后边的表达式 并返回结果,直到函数执行完毕;