Promise里在延时器里throw new Error,为什么不能被后面的reject回调或者catch捕获?
把throw new Error
语句放延时函数里,只会报错,不执行reject
函数或者catch
函数
var promise = new Promise((resolve, reject) => {
setTimeout(() => {
throw new Error('nono') //这里主动抛出错误
}, 500);
})
.then(()=>{},(err)=>{
console.log(1) //这里是reject时应该调用的函数,但是这里并没有执行,只会在控制台报错
console.log(err) //根本不执行这里
})
.catch((err)=>{
console.log(2) //这里catch都不执行
console.log(err)
})
而我不把throw new Error
语句放延时函数里,就能在reject
函数里执行
var promise = new Promise((resolve, reject) => {
throw new Error('nono') //这里直接抛出错误,就能被后面的reject函数执行到
})
.then(()=>{},(err)=>{
console.log(1) //这里就执行了
console.log(err)
})
.catch((err)=>{
console.log(2)
console.log(err)
})
另外,不用throw new Error
,而是直接reject()
,不论是否放在延时函数里都能正常被捕获
var promise = new Promise((resolve, reject) => {
setTimeout(() => {
reject('hehe')
}, 500);
})
.then(()=>{},(err)=>{
console.log(1) //可以捕获
console.log(err)
})
.catch((err)=>{
console.log(2)
console.log(err)
})
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
因为js是异步的,reject有监听事件,而throw new error 是按顺序执行的,当被放在setTimeout时,throw new
error在队列中,导致。catch在返回中没有捕捉到错误。