当前,我正在尝试确定在Promise中处理错误时应使用的模式。例如,我有下面的代码
promiseFunc()
.then(result => {
console.info(`.THEN:: ${result}`)
})
.catch(error => {
console.info(`.CATCH:: ${error}`)
})
function promiseFunc() {
return new Promise((resolve, reject) => {
setTimeout(() => {
throw Error("setTimeout's callback error")
resolve('resolution')
}, 1000)
})
}
我无法获得的是,如果其中的一个函数(在我的情况下为setTimeout())抛出错误,则应采用哪种方法拒绝Promise。换句话说,我需要一个拒绝而不是一个错误,但是我想到的唯一想法是添加一个try / catch块并从捕获中拒绝Promise。
答案 0 :(得分:3)
如果其中的一个函数(在我的例子中是setTimeout())抛出错误,应该使用哪种方法拒绝Promise
异步回调绝对不能抛出异常。您尝试实现的函数(setTimeout
)抛出同步异常(new Promise
处理),或者调用回调。在回调中,您必须调用resolve
或reject
,并且必须进行调用而不会引发异常。
如果您想在回调中做其他事情(除了调用resolve
/ reject
),可能会引发异常的事情:不要!
new Promise
应该只包装您要承诺的立即函数,而不要包装其他任何内容。在链接到Promise的then
回调中做更多的事情-then
将在其回调中处理异常:
function promiseFunc() {
return new Promise(resolve => {
setTimeout(resolve, 1000);
// ^^^^^^^ nothing can go wrong in here
}).then(() => {
throw "setTimeout's callback error";
// ^^^^^ here, it will lead to a rejection
return "resolution";
});
}
答案 1 :(得分:0)
您在异步函数中引发错误,而不是拒绝promise。
将throw Error("")
更改为reject("")
:
promiseFunc()
.then(result => {
console.info(`.THEN:: ${result}`)
})
.catch(error => {
console.info(`.CATCH:: ${error}`)
})
function promiseFunc() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject("setTimeout's callback error")
resolve('resolution')
}, 1000)
})
}
或添加一条try-catch语句,并在catch块中将其拒绝
setTimeout(() => {
try {
throw new Error("setTimeout's callback error")
} catch(error) {
reject(error)
}
resolve('resolution')
}, 1000)
答案 2 :(得分:0)
Resolve,Reject和Error是三类截然不同的东西,您的代码需要处理需要解决和何时拒绝的情况。如果您想要的条件已满,则调用resolve方法,条件无法满足时,则调用reject()方法。
如果您的代码引发任何错误或任何其他原因,则将执行链末尾的单个catch()块。
// doAsyncOperation1() returns a promise.
doAsyncOperation1()
.then(() => {
// ...
// doAnotherAsyncOperation() returns a promise
// which will be inserted into the chain.
return doAsyncOperation2();
})
.then((output) => {
// output will be the value resolved by the
// promise which was returned from doAsyncOperation2()
// ...
return doAsyncOperation3();
})
.catch((err) => {
// Handle any error that occurred in any of the previous
// promises in the chain.
});