我正在寻找一种方法来可靠地确定流中是否已处理所有数据。异步data
监听器可能在end
事件之后称为 ,在这种情况下,我不能使用end
事件来关闭数据库连接,例如data
事件仍在执行数据库查询。
示例:
const fs = require('fs')
const stream = fs.createReadStream('./big.file', { encoding: 'utf8' });
stream
.on('data', () => {
stream.pause();
setTimeout(() => {
console.log('data');
stream.resume();
}, 10);
})
.on('close', function() {
console.log('end');
});
这将多次记录“数据”,然后记录“结束”,再记录“数据”一次。
因此,在一个实际示例中,如果“数据”正在执行查询,而“结束”将关闭连接,则最后一个查询将引发错误,因为数据库连接过早关闭。
我注意到流中有一个closed
属性,当然还有isPaused()
方法,我可以使用这些方法来解决我的问题类型:
stream
.on('data', () => {
stream.pause();
databaseQuery().then(result => {
stream.resume();
if (stream.closed) {
closeConnection();
}
});
})
.on('close', function() {
if (!stream.isPaused()) {
closeConnection();
}
});
但是我不确定这是否是解决此问题的最佳方法。 我可以确定连接将完全关闭吗?
编辑:对于“结束”事件,我看到了类似的结果,无论我使用“结束”还是“关闭”都没关系,测试日志是相同的。