JSFiddle - React, Tailwind, and code Playground

by blesh

JavaScript

//Timed queue

var noop = function () {};

function TimedQueue() {
    var self = this;
    var queue = self.$queue = [];
    self.$running = false;

    self.$next = function () {
        self.$running = true;
        if (queue.length > 0) {
            return queue.shift()();
        }
        self.$running = false;
        return noop();
    };

    self.unpause = function () {
        console.log('unpause called');
        if (self.$paused) {
            self.$paused = false;
            self.$next();
        }
    };


    self.then = function (fn) {
        var self = this;
        self.$queue.push(function () {
            fn.apply(self);
            setTimeout(function () {
                self.$next();
            }, 0);
        });
        if (!self.$running && !self.$paused) {
            self.$next();
        }
        return self;
    };

    self.wait = function (delay) {
        var self = this;
        self.$queue.push(function () {
            setTimeout(function () {
                self.$next();
            }, delay);
        });
        return self;
    };

    self.pause = function () {
        var self = this;
        self.$queue.push(function () {
            self.$paused = true;
        });
        return self;
    };
}
TimedQueue.first = function () {
    return new TimedQueue();
};
var i = 0;

function test() {
    console.log(i++, new Date());
}

TimedQueue.first(test).then(test)
    .then(test).wait(3000).then(test)
    .then(function () {
        var tq = this;
        setTimeout(function () {
            tq.unpause();
        }, 4000);
    })
.pause()
.then(function(){
    console.log('done')
});