Here is a simple example using abbreviation. It works in serial mode, supports insertion order and does not require Bluebird.
function forEachPromise(items, fn) { return items.reduce(function (promise, item) { return promise.then(function () { return fn(item); }); }, Promise.resolve()); }
And use it as follows:
var items = ['a', 'b', 'c']; function logItem(item) { return new Promise((resolve, reject) => { process.nextTick(() => { console.log(item); resolve(); }) }); } forEachPromise(items, logItem).then(() => { console.log('done'); });
We found it useful to send an optional context to the loop. Context is optional and shared by all iterations.
function forEachPromise(items, fn, context) { return items.reduce(function (promise, item) { return promise.then(function () { return fn(item, context); }); }, Promise.resolve()); }
Your promise function will look like this:
function logItem(item, context) { return new Promise((resolve, reject) => { process.nextTick(() => { console.log(item); context.itemCount++; resolve(); }) }); }
Steven Spungin Jan 22 '17 at 12:57 2017-01-22 12:57
source share