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