JSFiddle - React, Tailwind, and code Playground

JavaScript

function encadear() {
    var cadeia = [].slice.call(arguments);
    return function(dadoInicial, end) {
        var fns = cadeia.slice();

        function exec(err, data) {
            if (err) return end(err);
            var next = fns.pop();
            if (!next) return end(null, data);
            next(data, exec);
        }
        exec(null, dadoInicial);
    }
}
function add1(n, callback) {
    setTimeout(function() {
        callback(null, n + 1);
    }, 10);
}
function mul3(n, callback) {
    setTimeout(function() {
        callback(null, n * 3);
    }, 10);
}
var add1mul3 = encadear(mul3, add1);

var fns = [5, 4, 2].map(function(nr) {
    return new Promise(function(resolve, reject) {
        add1mul3(nr, function(err, res) {
            resolve(res);
        })
    });
});
Promise.all(fns).then(function(result) {
    console.log(result); // [18, 15, 9]
});