为什么在使用await和EventEmitter时退出nodejs程序?

时间:2019-01-15 01:37:16

标签: javascript node.js es6-promise

看下面的代码:

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()都无法获得事件,它应该一直等待,不是吗?

3 个答案:

答案 0 :(得分:0)

如果您在第一个承诺解决之后重置计时器,则直到最后一个承诺解决后程序才会退出。

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

答案 1 :(得分:0)

我认为您只能使用1件事:Promise或Async / Await。

1]异步/等待示例

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'));

答案 2 :(得分:0)

如果您想让程序永远活着,可以将其添加到代码的顶部:

(function keepalive() {
    setTimeout(keepalive, 0x7FFFFFFF);
})();

基本上,只要有未决事件,运行时就应该保持打开状态。希望这会有所帮助。