46 lines
796 B
JavaScript
46 lines
796 B
JavaScript
export class TaskManager {
|
|
constructor() {
|
|
this._queue = [];
|
|
this._inTask = false;
|
|
}
|
|
|
|
enqueue() {
|
|
let completeSignal;
|
|
let taskComplete = new Promise((r, _) => {
|
|
completeSignal = r;
|
|
});
|
|
|
|
let readySignal;
|
|
let dbReady = new Promise((r, _) => {
|
|
readySignal = () => {
|
|
r(completeSignal);
|
|
};
|
|
});
|
|
|
|
this._queue.push({readySignal, taskComplete});
|
|
|
|
this._processQueue();
|
|
return dbReady;
|
|
}
|
|
|
|
async _processQueue() {
|
|
// We're already processing the queue
|
|
if (this._inTask) {
|
|
return;
|
|
}
|
|
|
|
while (true) {
|
|
let item = this._queue.shift();
|
|
if (!item) {
|
|
return;
|
|
}
|
|
|
|
this._inTask = true;
|
|
|
|
item.readySignal();
|
|
await item.taskComplete;
|
|
|
|
this._inTask = false;
|
|
}
|
|
}
|
|
} |