Sequence as Promise
It's zero dependency and lightweight function that allows execute array of functions and promises in sequence and returns Promise
What it do?
Behavior very similar to Promise.all
, but all promises or functions executes in sequence.
Function executes promises with functions one by one and returns promise withresults array
this code
promise1 . then ( ( ) => promise2 . then ( ( ) => promise3 . then ( callback ) ) ) . then ( done ) ;
equivalent to
const sequence = require ( ' sequence-as-promise ' ) ;
sequence ( [ promise1 , promise2 , promise3 , callback ] ) . then ( done ) ;
How to install
with npm
npm i --save sequence-as-promise
with yarn
yarn add sequence-as-promise
Basic usage
We have array of functions with promises, and we need to execute all that functions in sequence
All these functions accepts two arguments, (prevResult, results) => {}
prevResult
the result of previous function or promise call
results
an array of results from previous functions or promises calls
const sequence = require ( ' sequence-as-promise ' ) ;
sequence ( [
Promise . resolve ( { status : true } ) ,
( prevResult , results ) => {
return { moveCircleToMiddle : true } ;
} ,
( prevResult , results ) => {
return { showGrayCircle : true } ;
} ,
( prevResult , results ) => {
return { showMicrophone : true } ;
}
] ) . then ( ( results ) => console . log ( ' all done ' , results ) )
Functions that returns promise
Most standard use case is fetch dependant data one by one
const sequence = require ( ' sequence-as-promise ' ) ;
sequence ( [
fetchUser ( 32 ) ,
( user ) => {
if ( user && user . id === 1 ) {
return fetchAdminUrls ( user . id ) ;
}
return fetchUserUrls ( user . id ) ;
} ,
( urls ) => {
return urls . map ( makeLink )
}
] ) . then ( ( results ) => {
const [ user , _ , links ] = results ;
renderHTML ( user , links ) ;
} ) ;
Handle errors
Any function or promise in sequence can throw an error, so we need handle it
const sequence = require ( ' sequence-as-promise ' ) ;
sequence ( [
fetchUser ( 32 ) ,
( user ) => {
if ( user && user . id === 1 ) {
return fetchAdminUrls ( user . id ) ;
}
return fetchUserUrls ( user . id ) ;
} ,
( urls ) => {
return urls . map ( makeLink ) ;
}
] ) . then (
( results ) => {
const [ user , _ , links ] = results ;
renderHTML ( user , links ) ;
} ,
( results ) => {
const error = results . pop ( ) ;
renderError ( error ) ;
}
) ;
More examples
But, if we need to call all that functions with primitive values between them (why not?).
const sequence = require ( ' sequence-as-promise ' ) ;
sequence ( [
( ) => {
return { moveCircleToMiddle : true } ;
} ,
100 ,
( prevResult , results ) => {
return { showGrayCircle : prevResult } ;
} ,
( prevResult , results ) => {
return { showMicrophone : true } ;
} ,
500 ,
( prev , values ) => {
return { moveCircleToTop : true } ;
}
] ) . then ( ( results ) => console . log ( ' all done ' , results ) )
Or we have Promises in that array of functions.
const sequence = require ( ' sequence-as-promise ' ) ;
sequence ( [
( ) => new Promise ( ( resolve , reject ) => {
resolve ( { moveCircleToMiddle : true } ) ;
} ) ,
( ) => {
return { showGrayCircle : true } ;
}
] ) . then ( ( ) => console . log ( ' all done ' ) )