Maxwell Lasky Maxwell Lasky - 15 days ago 5
Javascript Question

Invoking an array functions that return promises in order without external dependencies

Without the use of any extra libraries (async, bluebird etc) I am trying to implement a function that returns a promise resolves (or rejects) based on an array of functions that return promises as an input parameter...

Promise.all(iterable)
has very similar functionality to what I am trying to accomplish exepct the promises in the
iterable
parameter of
Promise.all
do not execute in sequential order.

I could simply chain these functions together however what if
functionList
was a list of unkown length...

I have attemped to conceptually show what I am trying to accomplish below:

function foo() {
return new Promise((resolve, reject) => {
setTimeout( () => {
return resolve();
}, 200);
})
}

function bar() {
return new Promise((resolve, reject) => {
setTimeout( () => {
return resolve();
}, 200);
})
}

function baz() {
return new Promise((resolve, reject) => {
setTimeout( () => {
return reject();
}, 100);
})
}

const functionList = [foo, bar, baz];

function promiseSeries(functionList){
const results = [];
return new Promise((resolve, reject) => {
promiseList.map((promise, i) => {
return new Promise((_resolve, _reject) => {
promise()
.then((result) => {
results.push(result);
if (i === promiseList.length - 1) {
return resolve(results);
}
else return _resolve();
})
.catch(error => error)
})
})
})
}


Obviously with running Promise.all on functionList we will see that baz (even though its position is functionList[2] resolves first)

Neither Resolve promises one after another (i.e. in sequence)? or Running promises in small concurrent batches (no more than X at a time) provide answers to this question. I do not want to import a library to handle this single utility function and mostly I am just curious as to what this function would look like.

Answer

This is not more complicated than:

funcs.reduce((prev, cur) => prev.then(cur), Promise.resolve())
Comments