Serpa is a small utility library for promise chaining.
Promises may be chained in series or parallel:
var serpa = require(serpa),
series = serpa.series,
parallel = serpa.parallel,
split = serpa.split;
//Being task1, task2a, task2b and task3 functions
//that either return promises for async taks
//or a value, then:
var work = series( //configure the work to be done
task1,
parallel(task2a, task2b),
split(task3)
);
work() //do the work
.then(
function (result) {
console.log("Work finished with result" + result);
},
function (err){
console.log("Some task failed with err: " + err);
});
Series execution of the tasks. The result of each task is passed to the next task.
function addTwo(x) {
return x + 2;
}
function addThree(x) {
var defer = q.defer();
setTimeout(function () {
defer.resolve(x + 3);
},1000);
return defer.promise();
}
var work = series(
addTwo,
addThree
);
work(1).then(function (result) {
console.log(result); //eventually logs 6
});
All the tasks are executed in parallel. The entry value is passed to each task.
function addTwo(x) {
return x + 2;
}
function addThree(x) {
var defer = q.defer();
setTimeout(function () {
defer.resolve(x + 3);
},1000);
return defer.promise();
}
var work = parallel(
addTwo,
addThree
);
work(1).then(function (result) {
console.log(result); //eventually logs [3, 4];
});
The tasks are executed for each element of the array that should be the input to the chain.
function addTwo(x) {
return x + 2;
}
function addThree(x) {
var defer = q.defer();
setTimeout(function () {
defer.resolve(x + 3);
},1000);
return defer.promise();
}
var work = split(
addTwo,
addThree
);
work([1,2,3]).then(function (result) {
console.log(result); //eventually logs [6, 7, 8];
});
The tasks are executed and then the original value is returned
var work = preserve(
series(
split(
addTwo, addThree
)
)
);
work([1,2]).then(function (result){
console.log(result); //eventually logs [1,2];
});