我正在学习RxJS。我对下面的代码段有疑问。
var arr = [1,2,3,4,5];
var arraysource = Observable.from(arr);
arr.push(6);
var subscription = arraysource.subscribe(
x => console.log('onNext: %s', x),
e => console.log('onError: %s', e),
() => console.log('onCompleted'));
arr.push(7);
当我运行上面的代码时,我得到以下输出。
onNext: 1
onNext: 2
onNext: 3
onNext: 4
onNext: 5
onNext: 6
onCompleted
我的问题是为什么第七个元素没有被发布,这是在订阅后添加的?是因为输入流是冷流并且它的读取项是同步的吗?所以在完成火灾后添加的项目永远不会到达观察者?有人可以对这种行为有所了解吗?
答案 0 :(得分:2)
arraySource
是一个冷源,因此在订阅时会懒惰地实例化其值序列。那时,你的数组有6个值。是的,因为Rx.Observable.from(array)
同步生成它的值,你会看到在observable完成之后打印的所有6个值。
也就是说,在实际代码中,改变干预可观察量定义的参数并不是一个好习惯。它使您的程序很难推理,因为该变异的影响将取决于大量的事物(这里的同步性,可观察的运算符的实现等)。如果你有一个随着时间的推移而改变价值的论点,那么你在概念上就有一个可观察的不是你。因此,您可以将其建模为可观察的,以便于操作和推理。
答案 1 :(得分:2)
您可以创建自己的Observable来获取您正在寻找的功能
对于Rx 4,Rx 5 Beta(将java:
和next
更改为complete
onNext
onCompleted
示例http://jsbin.com/datuqoniyo/edit?js,console
http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-create