The pain of javascript is fighting with async functions, specially the big boss “CALLBACK HELL”, when you putting thousand console.log to make the code dirty to kill one CALLBACK bug. It lasted for long until I found Promises, which follows simple logical, organized resolve-reject structure and it solves most of the async problems, so thank you to Promises. However, a use case that chain N unknown number of promises with parameters and resolving them sequentially, it seem like impossible to accomplish by either native ES6 Promises or by third party libraries: q, bluebird, deferred.js etc. Failed example: Defining function which will be used many times in this article: genPromist var genPromist = function(para) {return new Promise(function(resolve, reject) {setTimeout(function() {console.log('para: ', para)resolve(para * para)}, 1000)})} Chain 4 promises and resolve it recursively: var promises = [];promises.push(genPromist(1));promises.push(genPromist(2));promises.push(genPromist(3)); var recursiveFunction = function(promisesList) {return new Promise(function(resolve, reject) {if (promisesList.length <= 0) {resolve()} else {return promisesList[0].then(function() {promisesList.shift();return recursiveFunction(promisesList);});}});} recursiveFunction(promises) Sadly, the program did not run as expected, and the array was resolved parallelly. And most of the libraries works well when promise function has no parameter, which means that a CLASS in javascript. promises Solution: The ways Javascript handling and are different ( issue of anonymous function with parameters ). functions of promises functions of promises with parameters So that handling this issue needed to push to an array list promise function (not a promise) PACU is a tool to solve the problem of chaining promises functions with parameters and resolving each continuously. Installation: $ npm install --save pacu Usage: var pacu require("pacu") = pacu.series(promisesList).then(function(result) { console.log("Result series: ", result) },function(err){ console.log("Error series: ", result) });