promise-all-sequential
Version:
Evaluate a list of promises, sequentially
102 lines (78 loc) • 3.37 kB
Markdown
[![NPM Version][npm-version]][npm-url]
[![License][license-badge]][license-url]
Extremely lightweight (270 bytes) library for evaluating promises sequentially with zero external dependencies.
```js
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.
This is a [Node.js](https://nodejs.org/en/) module available through the [npm registry](https://www.npmjs.com/).
Before installing, [download and install Node.js](https://nodejs.org/en/download/).
Installation is done using the [`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
```bash
$ npm install promise-all-sequential
```
Comparison with [`Promise.all()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) that calls functions simultaneously:
```js
// Prints "Second", then "First" - wrong order!
Promise.all([asyncFunc1(), asyncFunc2()]).then((results) => {
console.log(results); // [1, 2] - Correct
});
```
Comparison with chaining asynchronous functions:
```js
// 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);
});
```
Please note that **you cannot initialize the promise directly**, meaning that the following will not work:
```js
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:
```js
const asyncFunc = () => new Promise(...);
```
If you face any issues, please submit an [issue](https://github.com/jhamberg/promise-all-sequential/issues) or a [pull request](https://github.com/jhamberg/promise-all-sequential/pulls).
The author of promise-all-sequential is [Jonatan Hamberg](https://www.cs.helsinki.fi/u/hajo/)
[](https://github.com/jhamberg/promise-all-sequential/graphs/contributors)
[](LICENSE)
[]: https://img.shields.io/npm/v/promise-all-sequential.svg?style=flat-square
[]: https://www.npmjs.com/package/promise-all-sequential
[]: https://img.shields.io/badge/License-MIT-yellow.svg
[]: https://opensource.org/licenses/MIT