ES6实现async/await
// gen 为generator
实现Async的主要思路
- Async返回的是一个promise对象
- 使用一个step对generator进行遍历
- 使用一个Promise.resolve()来拿到每个yield的返回值,并且在下一次调用时传入,循环以往直到结束
- 有错误使用throw方法抛出,在generator内部捕获错误,然后成为reject状态,返回错误结果
function myAsync(genF){
return new Promise(function(resolve, reject) { // async返回的是一个promise对象
const gen = genF(); // 拿到这个遍历器
function step(nextF) {
let next;
try {
next = nextF(); // 执行传入的回调函数获取{value:xx,done:xx}
} catch(e) {// 出错就直接抛出,抛出的错误就是当前出错的promise对象
return reject(e);
}
if(next.done) {//完成就直接resolve
return resolve(next.value);
}
// 直接resolve当前的指针指向的对象然后继续执行下一个
Promise.resolve(next.value).then((res)=> {
step(()=> gen.next(res)); // 返回上一个promise对象的返回值
}).catch((e)=>{
step(()=> gen.throw(e)); // 错误就抛出
})
}
// 初始化调用这个遍历器
step(()=> gen.next());
});
}
// 测试代码
myAsync(function* () {
const a = yield Promise.resolve(1)
const b = yield new Promise((res, rej) => {
setTimeout(() => {
res(2)
}, 2000)
})
const c = yield Promise.resolve(3)
console.log(a, b, c);
try {
const d = yield Promise.reject(4)
} catch (error) {
console.log(error);
}
return [a, b, c]
}).then(console.log)
// 输出
// 1 2 3
// 4
// [1,2,3]