【问题标题】:Promise.all Rejection from API来自 API 的 Promise.all 拒绝
【发布时间】:2018-06-08 07:24:27
【问题描述】:

我查看了其他 stackoverflow 答案,但似乎找不到答案。

实际上,我正在编写一个模块来验证一些数据,然后如果没有错误,则将其传递给第三方 api。

我的问题是,如果 Promise.all 拒绝,那么我最初的调用承诺仍将移至下一个。

------my main app---------

const data = [1,0,1]
api.sendData(data)
    .then( () => {
         *ALWAYS HITTING THIS*
     })
    .catch(err => console.log(err))

---------the api---------

return await a.test(data).then(rd => {
    return rd
})
.catch(ed => {
    return ed
});

-----a.test function--------

let request = data.map((i) => {
    return new Promise((resolve, reject) => {
        if(i < 1) {
           reject('value to low')
        }
        resolve(i);
     });
});
    return await Promise.all(data)
});

谁能告诉我为什么我的主应用程序没有击中我的捕获? 上面的代码是伪代码,但描述了问题。

【问题讨论】:

  • 为什么,为什么这么多人认为return await somePromise 是正确的做法?提示,没有理由在那里使用await。无论哪种方式,您都在兑现承诺。

标签: javascript ecmascript-6 promise es6-promise


【解决方案1】:

我认为问题出在您在 api 函数和 catch method return a new promise 中发现错误(在您有效返回值时实现)

所以如果你没有发现错误,你的问题应该被修复,因为错误将被转发

return a.test(data).then(rd => {
   // do some stuffs ...

   return rd;
})
// no catch

【讨论】:

【解决方案2】:

你只能捕捉一次promise,你在catch中返回的是下一个then将如何解决或拒绝:

Promise.reject(88)
.catch(err=>"Hello World")
.then(resolve=>console.log("resolve is:",resolve))

Promise.reject(88)
.catch(err=>Promise.reject("Hello World"))//reject again
.catch(err=>console.log("reject is:",err))

代替:

return await a.test(data).then(rd => {
    return rd
})
.catch(ed => {
    return ed
});`

你可以这样做:return a.test(data)

提供的其他代码根本没有任何意义。如果您想提出一些请求但想获得所有结果,即使其中一些失败,您也可以查看this answer(最后一个代码块)。

该答案解释了为什么要创建 Promise,我建议您在了解 Promise 是什么以及如何使用它们之前不要使用异步语法。`

【讨论】:

    【解决方案3】:

    您可能有错字。 正如所写,您尝试 Promise.all() 一个整数数组,这将全部解析。

    你应该返回return await Promise.all(request) 而不是return await Promise.all(data),否则不会有任何被拒绝的承诺。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-27
      • 2019-10-13
      • 2021-02-15
      • 1970-01-01
      • 2021-08-13
      • 2013-01-26
      • 2021-05-17
      • 1970-01-01
      相关资源
      最近更新 更多