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);
})
});