Skip to content

Instantly share code, notes, and snippets.

@gblazex
Created November 22, 2016 21:37
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gblazex/10e1ff07ed2ff43a3b0baecfe723c40a to your computer and use it in GitHub Desktop.
Save gblazex/10e1ff07ed2ff43a3b0baecfe723c40a to your computer and use it in GitHub Desktop.
Promise.preferred
// Promises are started in parallel.
// Resolves with the first resolved value in array order.
// If there's no winner, it rejects with last rejection.
Promise.preferred = function (promisesOrdered) {
return new Promise((resolve, reject) => {
var resolvedValues = new WeakMap();
var resolvables = promisesOrdered.slice(); // copy
function onMemberResolved(value, member) {
resolvedValues.set(member, value);
if (member == resolvables[0])
resolve(value);
}
function onMemberRejected(reason, member) {
resolvables.splice(resolvables.indexOf(member), 1);
var firstValue = resolvedValues.get(resolvables[0]);
if (firstValue)
resolve(firstValue)
else if (!resolvables.length)
reject(reason);
}
function observeSettled(promise) {
promise.then(v => onMemberResolved(v, promise))
.catch(r => onMemberRejected(r, promise));
}
promisesOrdered.forEach(observeSettled);
});
};
Promise.firstInOrder = Promise.preferred;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment