Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brookjordan/32bf685a34c62288c04c9ef8ceeb7c10 to your computer and use it in GitHub Desktop.
Save brookjordan/32bf685a34c62288c04c9ef8ceeb7c10 to your computer and use it in GitHub Desktop.
Callback a list of promises in the order in which they complete.
/**
* Used like:
* dealWithPromisesAsTheyResolve([
* new Promise((res, rej) => setTimeout(res, 2000, 2000)),
* new Promise((res, rej) => setTimeout(res, 1000, 1000)),
* new Promise((res, rej) => setTimeout(res, 4000, 4000)),
* new Promise((res, rej) => setTimeout(res, 0, 0)),
* new Promise((res, rej) => setTimeout(rej, 3000, 3000)),
* ], num => console.log(num), err => console.log(`error: ${err}`));
*
* Will output:
* 0
* 1000
* 2000
* error: 3000
* 4000
*/
async function dealWithPromisesAsTheyResolve(promises, resolveCallback, rejectCallback) {
var _promises = new Map();
promises.forEach(promise => _promises.set(
promise,
promise
.then(value => [null, value, promise])
.catch(error => [error, null, promise])
));
while (_promises.size > 0) {
let [error, value, promise] = await Promise.race(_promises.values());
_promises.delete(promise);
if (error) {
rejectCallback(error);
} else {
resolveCallback(value);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment