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)
    })
阅读 6.9k
4 个回答

因为js是异步的,reject有监听事件,而throw new error 是按顺序执行的,当被放在setTimeout时,throw new
error在队列中,导致。catch在返回中没有捕捉到错误。

你定时器里面的函数执行已经超出了promise块的控制,你只有调用resolve或reject才能让它重新控制

Promise没关系,异步错误 javascript 本来就捕获不到.
Promise只是一套处理异步逻辑的方案, 所以想用这套方案,就得按这套方案的规则写代码.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题