鍍金池/ 問答/HTML/ Promise里在延時器里throw new Error,為什么不能被后面的re

Promise里在延時器里throw new Error,為什么不能被后面的reject回調(diào)或者catch捕獲?

throw new Error語句放延時函數(shù)里,只會報(bào)錯,不執(zhí)行reject函數(shù)或者catch函數(shù)

var promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        throw new Error('nono') //這里主動拋出錯誤
    }, 500);
})
    .then(()=>{},(err)=>{
        console.log(1) //這里是reject時應(yīng)該調(diào)用的函數(shù),但是這里并沒有執(zhí)行,只會在控制臺報(bào)錯
        console.log(err) //根本不執(zhí)行這里
    })
    .catch((err)=>{
        console.log(2) //這里catch都不執(zhí)行
        console.log(err)
    })

而我不把throw new Error語句放延時函數(shù)里,就能在reject函數(shù)里執(zhí)行

var promise = new Promise((resolve, reject) => {
    throw new Error('nono') //這里直接拋出錯誤,就能被后面的reject函數(shù)執(zhí)行到
})
    .then(()=>{},(err)=>{
        console.log(1) //這里就執(zhí)行了
        console.log(err)
    })
    .catch((err)=>{
        console.log(2)
        console.log(err)
    })

另外,不用throw new Error,而是直接reject(),不論是否放在延時函數(shù)里都能正常被捕獲

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)
    })
回答
編輯回答
吃藕丑

你定時器里面的函數(shù)執(zhí)行已經(jīng)超出了promise塊的控制,你只有調(diào)用resolve或reject才能讓它重新控制

2017年3月16日 08:29
編輯回答
舊時光

Promise沒關(guān)系,異步錯誤 javascript 本來就捕獲不到.
Promise只是一套處理異步邏輯的方案, 所以想用這套方案,就得按這套方案的規(guī)則寫代碼.

2017年3月13日 18:51
編輯回答
默念

因?yàn)閖s是異步的,reject有監(jiān)聽事件,而throw new error 是按順序執(zhí)行的,當(dāng)被放在setTimeout時,throw new
error在隊(duì)列中,導(dǎo)致。catch在返回中沒有捕捉到錯誤。

2018年5月19日 18:19