promise-results
Version:
Promise all results of a collection of promises whether they are resolved OR rejected.
52 lines (50 loc) • 1.65 kB
JavaScript
/**
* Promise to resolve once collection of promises has resolve or rejected.
*
* Loosely, based on promised-io/promise .allKeys, however:
* - Expects global Promise (es6-promise).
* - Yields keyed object with collection of results & rejections.
*
* @param {object|array} collection
* The collection of promises to wait for.
* @return Promise<object|array>
* Resolved with keyed object with collection of results & rejections
* Rejects with a keyed object with collection of results & rejections.
*/
module.exports = function promiseResultSets (collection) {
"use strict";
return new Promise(function(resolve, reject) {
var array = Object.keys(collection);
var length = array.length;
var resolved = 0;
var rejected = 0;
var results = {
resolved: Array.isArray(collection) ? new Array(length) : {},
rejected: Array.isArray(collection) ? new Array(length) : {}
};
if (length === 0) resolve(results);
else array.forEach(function checkIn (key) {
if (collection[key] && typeof collection[key].then === "function")
collection[key].then(resolveKey, rejectKey);
else
resolveKey(collection[key]);
function resolveKey(value) {
results.resolved[key] = value;
resolved++;
if (resolved === length) {
resolve(results);
}
else if (resolved + rejected === length) {
reject(results);
}
}
function rejectKey(value) {
results.rejected[key] = value;
rejected++;
if (resolved + rejected === length) {
reject(results);
}
}
});
});
};