Source: Queue.js

(function() {
    /**
     * Queue class
     * @augments Help4.jscore.Base
     */
    class Queue extends Help4.jscore.Base {
        /**
         * @override
         * @param {number} [time = 500]
         */
        constructor(time = 500) {
            const observer = new Help4.observer.TimeObserver(() => {
                Object.entries(this._jobs || {}).forEach(([jobId, job]) => setTimeout(job, 1));
            });

            super({
                statics: {
                    _time:     {init: time, destroy: false},
                    _jobs:     {init: {}, destroy: false},
                    _observer: {init: observer}
                }
            });
        }

        /**
         * @param {Function} job
         * @returns {null|string}
         */
        addJob(job) {
            const {_jobs, _observer, _time: time} = this;
            if (_jobs) {
                Object.keys(_jobs).length || _observer.observe('interval', {time});

                const jobId = Help4.createId();
                _jobs[jobId] = job;
                return jobId;
            }
            return null;
        }

        /**
         * @param {string} jobId
         * @returns {Queue}
         */
        removeJob(jobId) {
            const {_jobs, _observer} = this;
            if (_jobs) {
                delete _jobs[jobId];
                Object.keys(_jobs).length || _observer.disconnect();
            }
            return this;
        }

        /**
         * @param {number} time
         * @returns {Queue}
         */
        setTime(time) {
            const {_jobs, _observer, _time} = this;
            if (_jobs && _time !== time) {
                this._time = time;
                if (Object.keys(_jobs).length) {
                    _observer.disconnect();
                    _observer.observe('interval', {time});
                }
            }
            return this;
        }

        /** @returns {number} */
        getTime() {
            return this._time;
        }
    }

    /**
     * Standard queue.
     * @type {Queue}
     */
    Help4.Queue = new Queue();
})();