/promise-all-sequential

Evaluate a list of promises sequentially

Primary LanguageJavaScriptMIT LicenseMIT

promise-all-sequential

NPM Version License

Extremely lightweight (270 bytes) library for evaluating promises sequentially with zero external dependencies.

const promiseAllSequential = require("promise-all-sequential");

const asyncFunc1 = async () => new Promise((resolve) => {
    setTimeout(() => {
        console.log("First");
        resolve(1);
    }, 1000);
});

const asyncFunc2 = async () => new Promise((resolve) => {
    setTimeout(() => {
        console.log("Second");
        resolve(2);
    }, 250);
});

// Prints "First", then "Second" and returns results
promiseAllSequential([asyncFunc1, asyncFunc2]).then((result) => {
    console.log(result); // [1, 2]
});

Essentially, asyncFunc1 is guaranteed to finish before asyncFunc2 gets called. The result will be a promise which resolves with an array of results from the functions.

Installation

This is a Node.js module available through the npm registry.

Before installing, download and install Node.js.

Installation is done using the npm install command:

$ npm install promise-all-sequential

Examples

Comparison with Promise.all() that calls functions simultaneously:

// Prints "Second", then "First" - wrong order!
Promise.all([asyncFunc1(), asyncFunc2()]).then((results) => {
    console.log(results); // [1, 2] - Correct
});

Comparison with chaining asynchronous functions:

// Using async function chaining
const arr = [];
const results = async1().then((r1) => {
    arr.push(r1);
    return async2().then((r2) => {
        arr.push(r2);
        return async3().then((r3) => {
            arr.push(r3);
            return arr;
        });
    })
});
console.log(results);

// Using this library
promiseAllSequential([async1, async2, async3]).then((results) => {
    console.log(results);
});

Troubleshooting

Please note that you cannot initialize the promise directly, meaning that the following will not work:

const asyncFunc = new Promise(...);

This is because a promise starts executing its body as soon as it is created, making it no longer possible to force into sequential order. You must wrap the initialization into a function instead:

const asyncFunc = () => new Promise(...);

If you face any issues, please submit an issue or a pull request.

People

The author of promise-all-sequential is Jonatan Hamberg

List of all contributors

License

MIT