关于async里面try/catch的一个问题
function foo(){ throw new Error('zjl')}
function*fn(){
try{
yield foo();
}catch(e){
console.log(e)
}
}
上面会被caty/catch ,而下面这个Promise就不会被try/catch
function * fn(){
yield Promise.reject('ixl')
}
//执行next后,会报错.
function *fn(){
try{
yield Promise.reject('ixl')
}catch(e){
console.log(e)
}
}
//也会报错
而async里面,我看了下对await进行try/catch 可以避免 处于rejected状态的promise跳出async函数 怎么做到的?
7 回复
没有谁说过 yield 后能捕捉到 promise 的 reject 错误吧…
你肯定是被 co 库误导了,co 执行 generator 能用 try catch 捕获是因为它做了特殊处理,简单的说就是 reject 后会 throw 出异常
原生 generator 可不自带這個功能喔
来自酷炫的 CNodeMD
@hyj1991 还有个问题,
function* fn(){
try{
yield Promise.reject('ixl')
}catch(e){
console.log(e)
}
}
function foo(){
var g = fn()
var next = g.next(undefined)
Promise.resolve(next.value).then(function(){
},function(e){
try{
g.throw(e)
}catch(e){
console.log(e)
}
})
}
也就说外面的catch会先于里面的catch?
@5196666qwe 没看明白你说的外面和里面指的是啥,但是这段代码流程一定是这样:
- 第一个 g.next().value 得到的值是一个 rejected 状态的 promise
- Promise.resolve( rejected ),那么就会走到后面的 then 方法注册的 onReject 函数中
- 你在这个 onReject 中调用了 g.throw ,那么在这个 onReject 函数中 try 不 try 无所谓,因为 g.throw 相当于在 generator 函数中对应的位置 throw 了,所以会被 generator 函数中的 try catch 捕获,实际上 co 库也是利用这一点实现的 try catch 捕获异常
@hyj1991 外面是 fn generator里的try/catch ,里面是 onreject里面的try/catch,而我实验过了,把fn里面的try/catch去掉了,下面的try/catch是会执行的。。。
@5196666qwe 那必须啊,我说的无所谓是因为你在 generator 里面 try 了,要是 generator 里面没 try,那这个错误肯定会继续向外抛出呀
@5196666qwe 不客气哇