接收一个Generator函数,并返回一个Promise,实现类似于原生的async/await的效果。
关键点:返回一个Promise。其中generator执行。然后递归处理next结果,done就resolve,否则value转成Promise处理then进行递归,catch进行throw。
function asyncToPromise(generatorFunc) {
return new Promise((resolve, reject) => {
const generator = generatorFunc();
function handleResult(result) {
if (result.done) {
resolve(result.value);
} else {
Promise.resolve(result.value)
.then((res) => handleResult(generator.next(res)))
.catch((err) => handleResult(generator.throw(err)));
}
}
try {
handleResult(generator.next());
} catch (error) {
reject(error);
}
});
}