JSFiddle - React, Tailwind, and code Playground
by air_hadoken
JavaScript
function promiseChain(firstfn) {
var fns = Array.from(arguments).slice(1);
return function() {
var promise = Promise.resolve(firstfn.apply(null, arguments));
return fns.reduce(function(_promise, fn) {
return _promise.then(fn);
}, promise);
};
}
function promiseMap(list, fn) {
return Promise.resolve(list).then(function(resolved_list) {
resolved_list = Array.isArray(resolved_list) ? resolved_list : [resolved_list];
return Promise.all(resolved_list.map(fn));
});
}
function promiseFilter(list, fn) {
return Promise.all([
Promise.resolve(list),
promiseMap(list, fn)
]).then(function(pack) {
var values = pack[0], processed = pack[1], returns = [];
values.forEach(function(v, i) {
if(processed[i]) {
returns.push(v);
}
});
return returns;
});
}
function promiseReduce(list, fn, initial) {
return Promise.all([list, initial]).then(function(pack) {
var resolved_list = pack[0], resolved_initial = pack[1] || resolved_list.shift();
return Promise.resolve(resolved_list.reduce(function(a, b) {
return Promise.resolve(a).then(function(resolved_a) { return fn(resolved_a, b); });
}, resolved_initial));
});
}
function print(expected, obj) {
if(arguments.length < 1) {
obj = expected;
expected = null;
}
document.body.innerHTML += JSON.stringify(obj);
if(expected) {
document.body.innerHTML += " should be " + JSON.stringify(expected);
}
document.body.innerHTML += "<br>\n";
return obj;
}
promiseChain(
function(a) {
return Promise.resolve(a + 1);
},
function(b) {
return Promise.resolve(b * 2);
}
)(5).then(print.bind(null, 12));
promiseMap([1,2,3,4,5], function(v) { return v * 2; })
.then(print.bind(null, [2,4,6,8,10]));
promiseMap(Promise.resolve([1,2,3,4,5]), function(v) {
return new Promise(function(res) {
setTimeout(function() {
res(v * 2);
}, 10);
});
}).then(print.bind(null, [2,4,6,8,10]));
promiseReduce([1,2,3,4,5],...