promise-sequencer v3.0.0
sequencer
Run promises one after the other.
Install
npm install promise-sequencer
Usage
import sequencer from 'promise-sequencer';
Promise
If you use standard promises, you have the method all()
that will run a batch of promises independently from one to the other. sequencer
will run them one by one, stopping if one in the stack fails.
Usage
sequencer(
() => new Promise(resolve => resolve(1)),
() => new Promise(resolve => resolve(true))
);
Second promise is run only after and if first promise has resolved.
Rejections
A rejection would stop the stack.
sequencer(
() => new Promise((resolve, reject) => reject(new Error('Bug!'))),
() => new Promise(resolve => resolve(true))
);
Here, the second promise is never called.
Piping promises
The output of a promise is passed down to the next promise in stack:
sequencer(
() => new Promise(resolve => resolve(1)),
number => new Promise(() => {
console.log(number); // 1
})
);
You can also use a second argument, which is the current buffer of all outputs so far in stack.
sequencer(
() => new Promise(resolve => resolve(1)),
() => new Promise(resolve => resolve(2)),
(number, results) => new Promise(resolve => {
console.log(number); // 2
console.log(results); // [1, 2]
resolve();
})
);
Chain
sequencer returns a promise itself. The arguments of the results of all the stack.
sequencer(
() => new Promise(resolve => resolve(1)),
() => new Promise(resolve => resolve(2))
)
.then(results => {
console.log(results); // [1, 2]
})
.catch(error => { /*...*/ });
If you want the sequencer to return the last resolve, use sequencer.pipe()
:
sequencer.pipe(
() => new Promise(resolve => resolve(1)),
() => new Promise(resolve => resolve(2))
)
.then(result => {
console.log(result); // 2
})
Signature
You can declare the stack of promises as an array or as a list:
sequencer(promise1, promise2); // this is correct
sequencer([promise1, promise2]); // this is correct too
Promisify
sequencer comes bundled with an utility that can run node callbacks as a promise:
sequencer.promisify(fs.readdir, [__dirname]).then(/*...*/);
// Signature
promisify(Function functionWithCallback, [Mixed arguments]?, {Object functionBinder}?)