Имеется следующий код:
//добавляет путь файла в очередь string[];
enqueue(filePath: string): void {
this.queue.push(filePath);
if (!this.processing) {
this.processing = true;
this.ftp.connect().then(this.drain.bind(this));
}
}
// начинает извлекать пути из очереди, пока она не опустошится полностью
async drain(): Promise<void> {
if (this.queue.length) {
const filePath = this.queue.shift();
const fileStream = await this.ftp.get(filePath);
fileStream .on('data', chunk => this.entries.push(chunk.toString())).on('end', () => this.drain());
} else {
this.processing = false;
await this.ftp.disconnect();
}
}
Интересует такой вопрос. Может ли возникнуть ситуация когда очередь опустошилась и был вызван метод drain который установил this.processing = false и начинает await'ить отключение от фтп сервера (насколько я знаю если он натыкается на await управление передается дальше, и event loop соотв. не блочится), и может ли в этот момент произойти вызов метода enqueue который попытается соединится с фтп сервером (т.к. флаг this.processing === false) и соотв. отключиться он еще не успел, а уже попытается соединиться заново, что в теории может привести к ошибке. Может ли возникнуть такая ситуация или из-за специфики работы event loop'a нет? Если можно поподробнее.