PG
Size: a a a
PG
▲
▲
ВЛ
PG
▲
ВЛ
▲
ВЛ
ВЛ
class Queue {
constructor({ timeoutMs = 30000 }) {
// начнём с того что промис уже зарезолвлен
this.promise = Promise.resolve();
this.options = {
timeoutMs
};
}
/**
* При каждом запросе мы кладём промис в очередь и возвращаем очередь без своего промиса но со своим резолвером
* */
next() {
// создаём новый промис который будем класть в очередь
const ejectedPromise = createEjectedPromise();
const { resolve, reject, promise } = this.options.timeoutMs
? withTimeout(ejectedPromise, this.options.timeoutMs)
: ejectedPromise;
// сохраняем ссылку на старый промис
const prevPromise = this.promise;
// запихиваем в очередь новый промис
this.promise = this.promise.catch(() => void 0).then(() => promise);
// возвращаем последний резолвер, и список промисов кроме моего
return {
reject,
resolve,
promise: prevPromise
};
}
}
ну и в мидл варе
// если это запрос то встаём в очередь
const { promise, resolve } = queue.next();
// прокинем в следующий реквест механизм окончания реквеста
req.locals = {
resolveNextQueue: resolve
};
ВЛ
ВЛ
ВЛ
ВЛ
▲
KS
V
ВЛ
V
ВЛ