При текущей реализации api.get()
будет вызываться немедленно , когда add
отправляется в очередь.Вместо этого вы должны add
путь (или, может быть, и api.get
, и path
), и AsyncQueue
инициализировать Обещание, когда это возможно.Убедитесь, что add
возвращает Promise, который разрешается после завершения вызова API.
Например, в vanilla JS это может выглядеть так:
const apiGet = () => new Promise(resolve => setTimeout(resolve, 1000));
class AsyncQueue {
queue = [];
constructor() {
setInterval(this.resolveNext.bind(this), 2000);
}
add(fn, param) {
return new Promise(resolve => {
this.queue.unshift({ fn, param, resolve });
});
}
resolveNext() {
if (!this.queue.length) return;
const { fn, param, resolve } = this.queue.pop();
fn(param).then(resolve);
}
}
const queue = new AsyncQueue()
console.log('start');
// Will resolve after 2000 + 1000 seconds:
queue.add(apiGet, '/somepath').then(res => {
console.log('handling response 1');
});
// Will resolve after 4000 + 1000 seconds:
queue.add(apiGet, '/somepath').then(res => {
console.log('handling response 2');
});