JSFiddle - React, Tailwind, and code Playground
by mckabue
JavaScript
var promiseEach = function (arr) { // take an array and a function
var callback = typeof (arguments[1]) == 'function' ? arguments[1] : function (cur) {
return cur;
},
options = typeof (arguments[1]) == 'object' ? arguments[1] : typeof (arguments[2]) == 'object' ? arguments[2] : {};
options = Object.assign({
continueOnFail: false,
startValue: undefined,
nonArrayError: "Non array passed to each",
emptyArrayResolveValue: undefined
}, options);
// invalid input
if (!Array.isArray(arr)) return Promise.reject(new Error(options.nonArrayError));
// empty case
if (arr.length === 0) return Promise.resolve(options.emptyArrayResolveValue);
return arr.reduce(function (prev, cur) {
return prev[!!options.continueOnFail ? 'finally' : 'then'](function () {
//https://stackoverflow.com/a/27746324/3563013
//https://stackoverflow.com/a/50607656/3563013
//if its a promise, return the promise else return callback
return cur.then ? cur : callback(cur);
});
}, Promise.resolve(options.startValue));
};
[1, 2, 3, 4].map(function(i){
return new Promise(function(resolve, reject){
console.log(i);
setTimeout(function(){
console.log(i);
resolve();
}, 2000);
})
});
promiseEach([5, 6, 7, 8], function(i){
return new Promise(function(resolve, reject){
setTimeout(function(){
console.log(i);
resolve();
}, 2000);
})
});