(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();
})();