'Promise All retry

I know that promise.all() fails when even 1 of the promise is failed. I only want to try for failed promises and don't want to run promise.all() again.

Any recommendations on how I can achieve this in minimal way?



Solution 1:[1]

You may use async package and wrap all promise calls with closure with done argument.

Then simply resolve results.

const async = require('async');

const promiseAll = promises => {
  return new Promise((resolve) => {
    
   // preparing array of functions which has done method as callback
   const parallelCalls = promises.map(promise => {
      return done => {
        promise
          .then(result => done(null, result)
          .catch(error => {
            console.error(error.message);
            done();
          });
      }
    });
    
    // calling array of functions in parallel
    async.parallel(
      parallelCalls, 
      (_, results) => resolve(results.filter(Boolean))
    );

  });
};


router.get('/something', async (req, res) => {
  ...
  const results = await promiseAll(promises);
  ...
});

Or we can simply do Promise.all without using async package:

router.get('/something', async (req, res) => {
  ...
  const results = (
    await Promise.all(
      promises.map(promise => {
        return new Promise(resolve => {
          promise.then(resolve).catch(e => resolve());
        });
      });
    )
  ).filter(Boolean);
  ...
});

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1