flatMap to streamToRx永远不会完成

时间:2018-04-11 09:54:26

标签: javascript node.js rxjs

我有这个测试

const Rx = require('rx')
const fs = require('fs')
const {streamToRx} = require('rxjs-stream')

it('should not be infinite', done => {
  let streamObservable = streamToRx(fs.createReadStream('/some/file.txt'));
  Rx.Observable.of(1).flatMap(any => streamObservable)
  // streamObservable
    .map(any => 'file processed')
    .subscribe(x => console.log('next', x), err => {
        console.error(err)
        done(err)
      },
      () => {
        console.log('complete!')
        done()
      }
    )
})

此测试超时 - 表示流永远不会完成。但是当我不像这样用flatMap链接时:

const Rx = require('rx')
const fs = require('fs')
const {streamToRx} = require('rxjs-stream')

it('should not be infinite', done => {
  let streamObservable = streamToRx(fs.createReadStream('/some/file.txt'));
  // Rx.Observable.of(1).flatMap(any => streamObservable)
  streamObservable
    .map(any => 'file processed')
    .subscribe(x => console.log('next', x), err => {
        console.error(err)
        done(err)
      },
      () => {
        console.log('complete!')
        done()
      }
    )
})

然后输出是:

next file processed
complete!

链接这些可观察者时我做错了什么?这似乎只有在使用rxjs-stream从流转换第二个时才会发生。

1 个答案:

答案 0 :(得分:1)

我查看了RxNode.fromStreamrxjs-stream.streamToRx代码,RxNode.fromStream创建并返回一个冷Observable,而streamToRx错误地返回一个热Observable(在这种情况下是一个Subject) )。

在您的示例中,createReadStream因此在调用点执行并解析,因此后续订阅会订阅已解析的fs.readStream。简而言之,这是streamToRx中的错误。