JSFiddle - React, Tailwind, and code Playground

JavaScript

function chain(callback) {
    console.log("<chain>");
    var queue = [];
    function _next() {
        console.log("<_next>");
        var cb = queue.shift();
        if (cb) {
            cb(_next);
        }
        console.log("</_next>")
    }
    setTimeout(_next, 0);
    var then = function(cb) {
        console.log("<then>");
        queue.push(cb);
        console.log("</then>");
        return { then: then }
    }
    console.log("</chain>");
    return then(callback);
}

chain(function(next) {
    console.log('1');
    setTimeout(function() {
        console.log('2');
        next();
    }, 1000);
}).then(function(next) {
    console.log('3');
    setTimeout(function() {
        console.log('4');
        next();
    }, 1000);
}).then(function(next) {
    console.log('5');
    next();
});