看下面的代码:
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()
都无法获得事件,它应该一直等待,不是吗?
答案 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);
})();
基本上,只要有未决事件,运行时就应该保持打开状态。希望这会有所帮助。