我有这个测试
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从流转换第二个时才会发生。
答案 0 :(得分:1)
我查看了RxNode.fromStream
和rxjs-stream.streamToRx
代码,RxNode.fromStream
创建并返回一个冷Observable,而streamToRx
错误地返回一个热Observable(在这种情况下是一个Subject) )。
在您的示例中,createReadStream
因此在调用点执行并解析,因此后续订阅会订阅已解析的fs.readStream
。简而言之,这是streamToRx
中的错误。