rxjs6 使用 fromEventPattern 封装 readline 逐行读取文件

笑着哭i 提交于 2020-02-27 04:10:23

使用场景

有一个很大的文件500M左右, 需要将里面的数据读出来, 进行处理, python有直接可以读行的函数, js的回调方式写起来很不舒服, 在这里使用rxjs封装一下

 

封装一个函数, 传入文件地址, 然后返回一个流, 流中的数据就是每行数据的结果

注意要在流结束的时候关闭流和取消事件监听

const fs = require('fs')
const readline = require('readline')
const {fromEventPattern} = require('rxjs')
const {take, finalize} = require('rxjs/operators')

function getLines(filePath) {
  const stream = fs.createReadStream(filePath)
  const rl = readline.createInterface({
    input: stream
  });
  return fromEventPattern(
    handler => {
      rl.on('line', (...args) => {
        console.log('read line')
        handler(...args)
      });
    },
    handler => {
      rl.on('close', (...args) => {
        console.log('close', ...args)
        handler(...args)
      });
    }
  ).pipe(
    finalize(() => {
        console.log('finalize')
        stream.close()
        rl.removeAllListeners()
        rl.close()
      }
    ));
}

let p = './t.txt'
getLines(p).pipe(
  take(3)
).subscribe(
  line => {
    console.log('line', line)
  }
)


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!