我觉得很有趣的是,你必须手动执行此操作,而不是让对象在进程结束时自行销毁
这感觉很有趣,因为与异步相比,您可能接触过更多的同步编程。考虑下面的代码
fs = require('fs')
data = fs.readFileSync('file.txt', 'utf-8');
console.log("Read data", data)
当你在上面运行时,你会得到输出
$ node sync.js
Read data Hello World
这是同步代码。现在考虑相同的异步版本
fs = require('fs')
data = fs.readFile('file.txt', 'utf-8', function(err, data) {
console.log("Got data back from file", data)
});
console.log("Read data", data);
当你运行时你会得到以下输出
$ node async.js
Read data undefined
Got data back from file Hello World
现在如果你认为作为一个同步程序员,程序应该在最后结束console.log("Read data", data);
,但你得到的是随后打印的另一条语句。现在这感觉很有趣吗?让我们向进程添加退出语句
fs = require('fs')
data = fs.readFile('file.txt', 'utf-8', function(err, data) {
console.log("Got data back from file", data)
});
console.log("Read data", data);
process.exit(0)
现在,当您运行该程序时,它会在最后一条语句处结束。
$ node async.js
Read data undefined
但实际上并没有读取该文件。为什么?因为你从来没有给 JavaScript 引擎时间来执行挂起的回调。理想情况下,当没有剩余工作要做(没有待处理的回调、函数调用等...)时,进程会自动完成。这就是异步世界的工作方式。有一些不错的主题和文章值得您研究
https://medium.freecodecamp.org/walking-inside-nodejs-event-loop-85caeca391a9 https://medium.freecodecamp.org/walking-inside-nodejs-event-loop-85caeca391a9
https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
Node.js 中如何退出 https://stackoverflow.com/questions/5266152/how-to-exit-in-node-js
为什么在删除所有侦听器后我的 Node.js 进程没有终止? https://stackoverflow.com/questions/26004519/why-doesnt-my-node-js-process-terminate-once-all-listeners-have-been-removed
Node.js 进程如何知道何时停止? https://stackoverflow.com/questions/7698834/how-does-a-node-js-process-know-when-to-stop
因此,在异步世界中,您需要告诉进程退出,或者当没有待处理任务时它会自动退出(您知道如何检查 -process._getActiveRequests()
and process._getActiveHandles()
)