Задать вопрос
@dmitriyivvv

Node.js event loop и async await?

Имеется следующий код:
//добавляет путь файла в очередь 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 нет? Если можно поподробнее.
  • Вопрос задан
  • 302 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@abberati
frontend-разработчик
Напиши функцию
const delay = ms => new Promise(res => setTimeout(red, ms))

И поэкспериментируй.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 12:39
1000 руб./за проект
18 дек. 2024, в 12:37
10000 руб./за проект
18 дек. 2024, в 12:22
5000 руб./за проект