Promise里在延时器里throw new Error,为什么不能被后面的reject回调或者catch捕获?

发布于 09-06 20:27 字数 1282 浏览 10 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

剪不断理还乱2022-09-13 20:27:22

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

北斗星光2022-09-13 20:27:22

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

私藏温柔2022-09-13 20:27:22

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

人间☆小暴躁2022-09-13 20:27:22

这个说实话,我也不理解,期待一个回答

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文