chain-of-promises
Version:
Run through a list of functions sequentially, returning the first one that resolves
55 lines (47 loc) • 1.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = function (list) {
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
if (!list || !Array.isArray(list)) {
return Promise.reject(new Error('List must be an array'));
}
if (list.length === 0) {
return Promise.reject(new Error('List must not be empty'));
}
if (list.filter(function (fn) {
return typeof fn !== 'function';
}).length > 0) {
return Promise.reject(new Error('List items must be functions'));
}
try {
return list.slice(1).reduce(function (previous, fn) {
return previous.catch(function () {
return tryFn(fn, args);
});
}, tryFn(list[0], args)).catch(function () {
return Promise.reject(new Error('No items resolved'));
});
} catch (e) {
return Promise.reject(e);
}
};
/**
* try to resolve a function.
* resolve if it returns a resolved promise or value
* reject if it returns a rejected promise or throws an error
* @param {function} fn
* @param {array} args
* @returns {Promise}
*/
function tryFn(fn, args) {
try {
return Promise.resolve(fn.apply(null, args));
} catch (e) {
return Promise.reject(e);
}
}
module.exports = exports['default'];