Files
OpenNoodl/packages/noodl-viewer-react/src/async-queue.js
Michael Cartner b9c60b07dc Initial commit
Co-Authored-By: Eric Tuvesson <eric.tuvesson@gmail.com>
Co-Authored-By: mikaeltellhed <2311083+mikaeltellhed@users.noreply.github.com>
Co-Authored-By: kotte <14197736+mrtamagotchi@users.noreply.github.com>
Co-Authored-By: Anders Larsson <64838990+anders-topp@users.noreply.github.com>
Co-Authored-By: Johan  <4934465+joolsus@users.noreply.github.com>
Co-Authored-By: Tore Knudsen <18231882+torekndsn@users.noreply.github.com>
Co-Authored-By: victoratndl <99176179+victoratndl@users.noreply.github.com>
2024-01-26 11:52:55 +01:00

48 lines
926 B
JavaScript

export default class ASyncQueue {
constructor() {
this.queue = [];
this.pendingPromise = false;
}
enqueue(promise) {
return new Promise((resolve, reject) => {
this.queue.push({
promise,
resolve,
reject
});
this.dequeue();
});
}
dequeue() {
if (this.workingOnPromise) {
return false;
}
const item = this.queue.shift();
if (!item) {
return false;
}
try {
this.workingOnPromise = true;
item
.promise()
.then((value) => {
this.workingOnPromise = false;
item.resolve(value);
this.dequeue();
})
.catch((err) => {
this.workingOnPromise = false;
item.reject(err);
this.dequeue();
});
} catch (err) {
this.workingOnPromise = false;
item.reject(err);
this.dequeue();
}
return true;
}
}