async 函数的实现,就是将 Generator 函数和自动执行器,包装在一个函数里。
async function fn(args){
// ...
}
// 等同于
function fn(args){
return spawn(function*() {
// ...
});
}
function spawn(genF) {
return new Promise(function(resolve, reject) {
var gen = genF();
function step(nextF) {
try {
var next = nextF();
} catch(e) {
return reject(e);
}
if(next.done) {
return resolve(next.value);
}
Promise.resolve(next.value).then(function(v) {
step(function() { return gen.next(v); });
}, function(e) {
step(function() { return gen.throw(e); });
});
}
step(function() { return gen.next(undefined); });
});
}
摘自 http://www.ruanyifeng.com/blog/2015/05/async.html
没想明白 spawn 里的catch 什么情况下才会执行了?
和 async await 一样的效果吗?
下面是 async await 捕获异常的写法。
摘自:https://ostack.cn/a/1190000019854513
async function run() {
// 这里return 和 await 都可以
return Promise.reject(new Error("Oops!"));
}
run()
.catch(function handleError(err) {
err.message; // Oops!
})
.catch(err => {
process.nextTick(() => {
throw err;
});
});
矛盾来了:
为什么我把 run 写成 上面 generator的形式。没有同样的效果?
function run(args){
return spawn(function*() {
return Promise.reject(new Error("Oops!"));
});
}
run()
.catch(function handleError(err) {
err.message; // Oops!
})
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…