Promise.all不会发现错误

时间:2018-03-28 22:23:34

标签: javascript error-handling promise

我很难用Promise.all处理错误:

return Promise.all([
  this.pagination(),
  this.prepareParams(this.params, this.requestData),
  this.fetchRecipes(this.apiData, this.params)
])
  .catch(e => console.log());

首先,我只是试图在this.pagination()中抛出一个异常,它甚至被处理了,但奇怪的是,下一个Promise尽管被执行了。

pagination(): Promise<any> {
  return new Promise(resolve => {

    if(...) {
      ...
      resolve();

    } else {
      ...
      throw "no more results";
    }
}

然后我尝试使用Promise.reject("no more results")代替,但问题是它现在忽略了catch

  

未捕(承诺):没有更多结果

更新

为了澄清其他人:我的初衷是为了防止执行下一个2 Promise,如果第一个被拒绝的话。我错误地认为Promise.all符合这个要求。感谢traktor53的回答,我意识到链接承诺是一个更好的解决方案。

3 个答案:

答案 0 :(得分:2)

Promise.all在返回结果数组之前等待其参数数组中的所有promise都得到满足,但是一旦任何的promises中的任何,它将拒绝它返回的promise。数组被拒绝(“快速拒绝”)。

Promise.all就所传递的每一笔承诺调用then以获取其履行的价值或拒绝的理由。 如果其中一个被拒绝,它不会试图中止其他承诺 - Promise标准中没有机制可以取消承诺的操作。

如果您希望仅在前一个承诺成功后继续执行承诺操作,请使用链接而不是promise.all,注意承诺回调中this值是否正确(例如,使用箭头功能):

function objectMethod () {
    return this.pagination()
    .then( data=>this.prepareParams(this.params, this.requestData))
    .then( data=>this.fetchRecipes(this.apiData, this.params));
}

// catch errors encountered during call:
someObject.someMethod().catch(e => console.log(e));

答案 1 :(得分:0)

callback parameter to the Promise constructor (MDN)有两个参数,名为resolvereject,后者是你遗漏的。您必须将其传递给reject,而不是抛出错误。因此:

pagination(): Promise<any> {
  return new Promise((resolve, reject) => {

    if(...) {
      ...
      resolve();

    } else {
      ...
      reject("no more results");
    }
}

答案 2 :(得分:0)

最好添加 try - 在调用函数时捕获块

其他

pagination(): Promise<any> {
    return new Promise((resolve, reject) => {
       if(...) {
          ...
          resolve();

       } else {
          ...
          reject("no more results");
       }
}

在你的函数调用中。

pagination().then(err, value) {}