处理Promise中错误的正确方法

时间:2018-12-16 15:55:47

标签: javascript node.js promise

当前,我正在尝试确定在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。

3 个答案:

答案 0 :(得分:3)

  

如果其中的一个函数(在我的例子中是setTimeout())抛出错误,应该使用哪种方法拒绝Promise

异步回调绝对不能抛出异常。您尝试实现的函数(setTimeout)抛出同步异常(new Promise处理),或者调用回调。在回调中,您必须调用resolvereject,并且必须进行调用而不会引发异常。

如果您想在回调中做其他事情(除了调用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.
});