让节点不退出的更好方法是什么?

时间:2012-01-24 15:51:50

标签: node.js

在节点程序中,我正在使用fs.createReadStream从文件流中读取。但当我暂停流程时程序退出。我认为程序会继续运行,因为文件仍然打开,只是没有被读取。

目前为了让它不退出我设置了一个什么都不做的间隔。

setInterval(function() {}, 10000000);

当我准备让程序退出时,我清除它。但是有更好的方法吗?

节点将退出的示例代码:

var fs = require('fs');

var rs = fs.createReadStream('file.js');
rs.pause();

1 个答案:

答案 0 :(得分:6)

当没有排队的工作时,节点将退出。在pause上拨打ReadableStream只会暂停data事件。此时,不再发出任何事件,也没有未完成的工作请求,因此Node将退出。 setInterval起作用,因为它算作排队工作。

通常这不是问题,因为在暂停该流后你可能会做某事。一旦你resume流,就会有一堆排队的I / O,你的代码将在Node退出之前执行。

让我举个例子。这是一个退出而不打印任何内容的脚本:

var fs = require('fs');

var rs = fs.createReadStream('file.js');
rs.pause();

rs.on('data', function (data) {
  console.log(data); // never gets executed
});

流暂停,没有出色的工作,我的回调永远不会运行。

但是,这个脚本确实打印输出:

var fs = require('fs');

var rs = fs.createReadStream('file.js');
rs.pause();

rs.on('data', function (data) {
  console.log(data); // prints stuff
});

rs.resume(); // queues I/O

总之,只要你最后打电话给resume,你应该没事。