首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少Promise.all?

减少Promise.all?
EN

Stack Overflow用户
提问于 2018-08-28 20:58:08
回答 2查看 859关注 0票数 2

我想多次调用我的api,然后只返回出错的对象(这里是worker)

你对这个实现有什么看法?(我不喜欢.then(()=> false,但即使使用reduce,我也没有想出更好的实现)

我希望避免在Promise.all之后进行筛选

谢谢

代码语言:javascript
复制
updateWorkersStatusOnMissions: (workersOnMissions, apiService) => {
    const updateWorkerStatusOnMissionPromises = workersOnMissions
      .map(workerOnMission =>
        apiService.put('missions', formatWorkerOnMission(workerOnMission))
          .then(() => false)
          .catch(() => formatWorkerInError(workerOnMission))
      )
    return Promise
      .all(updateWorkerStatusOnMissionPromises)
      .then(filter(Boolean))
  },
EN

回答 2

Stack Overflow用户

发布于 2018-08-28 21:10:42

我通常做的是在结果周围引入某种“盒子”,它可以告诉我从承诺中获得的“种类”结果。promise总是会向您返回值,但根据提供then(onSuccess, onFail)的位置不同,返回值的类型会有所不同。

代码语言:javascript
复制
const into = type => val => ({ type, val })

const arrayOfstuff = [];

const arrayOfPromises = arrayOfstuff.map(stuff => makePromise(stuff)
  .then(into("success"), into("error")))

const successFullStruff = Promise.all(arrayOfPromises)
  .then(filter(result => result.type === "success"))

const failedStuff = Promise.all(arrayOfPromises)
  .then(filter(result => result.type === "error"))
票数 2
EN

Stack Overflow用户

发布于 2018-08-28 21:22:10

如果您希望根据谓词对列表/数组进行分区(在本例中,是承诺已解决还是已拒绝),请使用partition

代码语言:javascript
复制
 const partitionP = coll => {
   const resolved = [];
   const rejected = [];
   return Promise.all(coll.map(p => {
     p.then(result => resolved.push(result)).catch(err => rejected.push(err));
   }).then(_ => [resolved, rejected]);
 });

 async getApiResults = workersOnMissions => {
   const [results, errors] = await partitionP(workersOnMissions.map(workerOnMission => {
     return apiService.put('missions', formatWorkerOnMission(workerOnMission));
   }));
   // do something with the results/errors or just return them
 };

在这里,您确实需要一个Promise感知分区,因为如果数组中的任何Promise拒绝,Promise.all将立即拒绝,这意味着您需要手动管理迭代(在本例中,通过确保.catch所有拒绝并将它们放回快乐路径)。否则,您可以做一些更简单的事情,比如映射api调用以获得Promises数组,然后在.then处理程序中对结果进行分区。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52058529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档