3.0.0 • Published 8 years ago

promise-sequencer v3.0.0

Weekly downloads
1
License
ISC
Repository
-
Last release
8 years ago

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}?)