async 的语法糖 函数是如何捕获异常的?——大佬间文章矛盾
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://segmentfault.com/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!
})
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
var gen = genF();
。gen.next
gen.throw
。也就是说,try-catch 捕获的就是这两个操作中可能抛出的异常。gen.next
gen.throw
是什么?这你就需要复习一下 Generator 的知识了。gen.next
,你用yield value
就是往外报数,外面的人能拿到你报的数next.value
,也能判断出你有没有结束next.done
。如果觉得你报的数有问题,就用next.throw
告诉你这个报的数有问题你要处理下。genF
中每次从报上一个数(或最开始)到报下一个数中可能抛出的异常,即两次 yield 之间执行的代码;以及如果出错了,错误交给你后你在处理错误的过程中可能犯的二次错误。@will 那下面 g.throw ('出错了')后, 第二个catch 为什么捕获不到 ?