NodeJS:可靠地对封闭流进行操作

时间:2019-01-21 19:54:01

标签: node.js stream

我正在寻找一种方法来可靠地确定流中是否已处理所有数据。异步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();
    }
  });

但是我不确定这是否是解决此问题的最佳方法。 我可以确定连接将完全关闭吗?

编辑:对于“结束”事件,我看到了类似的结果,无论我使用“结束”还是“关闭”都没关系,测试日志是相同的。

0 个答案:

没有答案