RxJS将新项添加到未发布到订阅者的数组流中

时间:2016-06-09 20:38:23

标签: javascript rxjs

我正在学习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

我的问题是为什么第七个元素没有被发布,这是在订阅后添加的?是因为输入流是冷流并且它的读取项是同步的吗?所以在完成火灾后添加的项目永远不会到达观察者?有人可以对这种行为有所了解吗?

2 个答案:

答案 0 :(得分:2)

arraySource是一个冷源,因此在订阅时会懒惰地实例化其值序列。那时,你的数组有6个值。是的,因为Rx.Observable.from(array)同步生成它的值,你会看到在observable完成之后打印的所有6个值。

也就是说,在实际代码中,改变干预可观察量定义的参数并不是一个好习惯。它使您的程序很难推理,因为该变异的影响将取决于大量的事物(这里的同步性,可观察的运算符的实现等)。如果你有一个随着时间的推移而改变价值的论点,那么你在概念上就有一个可观察的不是你。因此,您可以将其建模为可观察的,以便于操作和推理。

答案 1 :(得分:2)