返回承诺并发现错误

时间:2015-10-14 07:44:41

标签: javascript promise ecmascript-6 es6-promise

我很担心将promise中的错误传递给catch处理程序。

使用下面的代码,如果promise2导致错误,是否传递给底部的catch?另外,我在第一个“then”内返回作为承诺返回promise2,还是返回doc

promise1(foo).then(doc =>{
  return promise2(doc).then(doc => {
    return doc
  })
}).then(doc =>{
  console.log(doc)
}).catch(err => {
  console.error(err)
})

干杯

2 个答案:

答案 0 :(得分:0)

then可以返回一个承诺,但如果某些内容失败,则需要明确返回拒绝。在下面的示例中,changedDoc作为newDoc

传递给第二个then
promise1(foo).then(doc =>{
  // changedDoc = doc.....
  if (good things happened) {
     return changedDoc;
  } else {
     return new Promise.reject("error");
  }
}).then(newdoc =>{
  console.log(newdoc)
}).catch(err => {
  console.error(err)
})

答案 1 :(得分:0)

then可以收到两个参数:

  • 履行承诺时的情况
  • 其他因为承诺被拒绝(有目的地,或因为抛出异常)

如果执行代码时出错,无论是在fullfilled中还是在被拒绝的情况下,执行将在下一次被拒绝的回调中继续。在您的代码中,第一个被拒绝的回调是catch回调中指定的回调。如果该块不存在,则异常将继续冒泡到代码中的第一个catch块。并且,如果没有这样的块,它将由浏览器处理,并向用户显示为错误。

如果您look at the documentation,您会发现catch就像只接收第二个参数的then一样:

Promise.prototype.then(onFulfilled, onRejected)

Promise.prototype.catch(onRejected)

您还可以查看this documentation on handling exceptions with promises

Promises的整个想法是能够链接,以便成功传播到onFullfilled回调,它可以无错误地运行,并为下一个onFullfilled处理程序返回一些东西,或者运行错误,将由下一个onRejected处理。错误可能是有目的的拒绝,也可能是未处理的异常。