我们用生成器模拟一个方法
这个方法可以用同步的方式处理异步,也就是类似 async await
function* task(url) {
const d = yield 1;
const resp = yield fetch(url);
const result = yield resp.json();
console.log(result);
}
run(task);
function run(generatorFunc) {
const generator = generatorFunc();
// 启动任务(开始迭代)
let result = generator.next();
handleResult(result);
function handleResult(result) {
if (result.done) {
return;
};
// 迭代没有完成,分两种情况
// 1. 迭代数据是一个 Promis
// 2. 迭代数据是其他数据
if (typeof result.value.then === 'function') {
// 1. 迭代数据是一个 Promise
// 等待 Promise 完成后,再进行下一次迭代
result.value.then(data => {
result = generator.next(data);
handleResult(result);
});
} else {
// 2. 迭代的数据是其他数据,直接进行下一次迭代
result = generator.next(result?.value);
handleResult(result);
};
}
}
网友评论