【发布时间】:2018-10-04 10:10:43
【问题描述】:
我在 nodeJS 中遇到了一个相当奇怪的问题,我不知道为什么。
考虑以下代码:
(async () => {
console.log ("1");
await new Promise ((resolve, reject) => {
setTimeout (() => {
console.log ("2");
resolve ();
}, 1000);
});
console.log ("3");
process.exit ();
})();
这段代码完全按照它应该做的。它按该顺序打印123。在打印1 之后,它会等待大约一秒钟。完美的。现在让我们看下面的例子:
const fs = require ("fs");
(async () => {
const stream = fs.createWriteStream ("file.txt");
stream.write ("Test");
console.log ("1");
await new Promise ((resolve, reject) => {
stream.on ("finish", () => {
console.log ("2");
resolve ();
});
});
console.log ("3");
process.exit ();
})();
据我了解,此代码应该完成,或者 - 如果 finish 事件永远不会被触发 - 无限运行。发生的情况正好相反:它打印1,然后退出。它不应该至少在退出之前打印另一个3,因为这是脚本的结尾吗?
重要:我知道承诺不会解决,因为.end() 没有在流上调用。我想知道为什么脚本还是完成了。
谁能向我解释这种行为?
【问题讨论】:
-
"end"通常是事件。这样做也是一种不好的做法。如果您必须在 Promise 中包装事件处理程序,则创建实例并在包装 Promise 的“内部”注册所有处理程序。 -
实际上,可写流需要
finish-event,而可读流需要end-event,所以这应该不是问题。 -
对不起,反着读。我看到您的误解,因为您似乎认为事情要等到您真正明确地关闭文件句柄。他们没有。
-
我想我不明白你在这里。承诺应该等到它被解决。它永远不会被解决,否则,我们会看到
2事先打印出来。为什么脚本不等待承诺就退出了? -
不。阅读我的回答,希望这是一个合理的演示。