-
Notifications
You must be signed in to change notification settings - Fork 390
First fulfilled promise by array order
Brian Cavalier edited this page Jul 2, 2014
·
3 revisions
Competitive races like when.any and when.race are primarily for determining the first promise to fulfill or reject in time/causal order. If you need to find the first promise to fulfill in array index order, you can use recursion, similar to the following:
// Returns the fulfilled promise with the lowest array index.
// If all promises in the array reject, returns a rejected promise
// whose reason is an Error with an `.errors` Array property containing
// all the rejection reasons.
function findFirst(promises){
return recurseFindFirst(0, [], promises);
}
function recurseFindFirst(i, errors, promises) {
if(i === promises.length) {
var e = new Error('All promises rejected');
e.errors = errors;
return when.reject(e);
}
return when(promises[i]).catch(function(e) {
errors.push(e);
return recurseFindFirst(i+1, errors, promises);
});
}Here's an example usage. Note that this logs 'c', since it has a lower index that 'd', even though 'd' fulfills first in time. In contrast, when.any would log 'd', and when.race would reject with Error('a').
var testList = [
when.reject(new Error('a')),
when.reject(new Error('b')),
when.resolve('c').delay(1000),
when.resolve('d')
];
findFirst(testList).done(console.log.bind(console)); // Logs 'c'