Почему программа nodejs завершает работу при использовании await & EventEmitter? - PullRequest
0 голосов
/ 15 января 2019

Посмотрите на этот код:

const { EventEmitter } = require('events');

class Trigger extends EventEmitter {
  constructor () {
    super();
  }

  run() {
    setTimeout(() => {
      this.emit('done');
    }, 1000);
  }

  waitUntilDone() {
    const this_ = this;
    return new Promise((resolve) => {
      this_.on('done', () => {
        resolve();
      });
    })
  }
}

async function main() {
  const tr = new Trigger();
  tr.run();
  console.log('run');
  // 如果监听的事件永远不会抛出,则此处程序会直接退出
  await tr.waitUntilDone().then(() => console.log('Promise done'));
  await tr.waitUntilDone().then(() => console.log('Promise done'));
  console.log('final done');
}

main();

Программа выйдет на втором await tr.waitUntilDone().t..., при этом ничего не регистрируется.

Даже второй tr.waitUntilDone() никогда не сможет получить событие, оно должно ждать вечно, не так ли?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Я думаю, что вы должны использовать только 1 вещь: Promise или Async / Await.

1] Пример Async / Await

async function main() {
    const tr = new Trigger();
    console.log('run');

    tr.run();
    await tr.waitUntilDone();
    console.log('Promise done');

    tr.run();
    await tr.waitUntilDone();
    console.log('Promise done')

    console.log('final done');
}

2] Пример обещания

function main() {
  const tr = new Trigger();
  console.log('run');
  tr.run();
  tr.waitUntilDone().then(() => console.log('Promise done'));
  tr.waitUntilDone().then(() => console.log('Promise done'));
  console.log('final done');
}

Ваше выражение "await tr.waitUntilDone().then(() => console.log('Promise done'));" неверно. Правильным будет что-то вроде этого "await tr.waitUntilDone().then(() => (console.log('Promise done'), Promise.resolve()));" или "tr.waitUntilDone().then(() => console.log('Promise done'));"

0 голосов
/ 15 января 2019

Если вы сбросите таймер после разрешения первого обещания, программа не завершит работу, пока не решится последнее обещание.

async function main() {
    const tr = new Trigger();
    tr.run();
    console.log('run');

    await tr.waitUntilDone().then(() => { 
        console.log('Promise done'); 
        // Reset the timer (this will keep the program alive)
        tr.run();
    });
    await tr.waitUntilDone().then(() => console.log('Promise done'));
    console.log('final done');
}

Вы увидите вывод:

run
Promise done
Promise done
final done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...