Уменьшить Promise.all? - PullRequest
       18

Уменьшить Promise.all?

0 голосов
/ 28 августа 2018

Я хотел бы несколько раз вызвать мой API, а затем вернуть только мой объект с ошибками (здесь это рабочие)

Что вы думаете об этой реализации? (Мне не нравится .then(()=> false, но я не нашел лучшей реализации даже при уменьшении)

Я бы хотел избежать фильтрации после Promise.all

Спасибо

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))
  },

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Если вы хотите разделить список / массив на основе предиката (в данном случае, будет ли Обещание разрешено или отклонено), используйте partition!

 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.all немедленно отклонит, если какое-либо из Promises в массиве отклонится, что означает, что вам нужно вручную управлять итерацией (в этом случае, убедившись, что .catch любой отказы и вернуть их на счастливый путь). В противном случае вы можете сделать что-то более простое, например, отобразить вызов API для получения массива Promises, а затем разделить результат в обработчике .then.

0 голосов
/ 28 августа 2018

То, что я обычно делаю, это вводит некоторую «рамку» вокруг результатов, которая позволяет определить «вид» результата, который я получаю из обещания. Обещание всегда будет возвращать вам значение, но в зависимости от того, где оно было предоставлено then(onSuccess, onFail), тип может быть другим.

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"))
...