`observeOn`和参数化调度程序之间的区别

时间:2015-06-23 13:05:46

标签: rxjs

我希望以下两段代码是等效的。默认情况下,重复使用currentThread调度程序。如果我们改变它immediate调度程序:

Rx.Observable.fromArray([1,2,3,4,5]).flatMap(a => {
  return Rx.Observable.repeat(a, 3, Rx.Scheduler.immediate)
})
.subscribe(r => console.log(r));

上面的代码产生了预期的结果:1, 1, 1, 2, 2, 2, ...。但是下面的代码没有,并产生一系列混合值:

Rx.Observable.fromArray([1,2,3,4,5]).flatMap(a => {
  return Rx.Observable.repeat(a, 3).observeOn(Rx.Scheduler.immediate)
})
.subscribe(r => console.log(r));

我不明白这种行为,但我想我错过了一些东西。 repeat可以传递一个Scheduler参数,但我想我也可以使用observeOn在特定的Scheduler上强制使用Observable。我错过了什么?

1 个答案:

答案 0 :(得分:2)

不同之处在于,一个人正在使用调度程序进行生成,第二个就是使用调度程序进行传播。

在第二个版本中,您仍然使用currentThread来创建值。 observeOn只会在从前一个运算符发出值后将值强制转换到不同的调度程序,但对于生成事件的运算符,这不会影响这些事件的生成。

如果您查看一些创建运算符(如fromArray),您会看到类似的内容:

//Changing the scheduler will change how recursive scheduling works
scheduler.schedulerRecursiveWithState(0, function(self, state) {
      if (i < len) {
        observer.onNext(array[i]);
        //Schedule the next event
        self(i + 1);
      } else {
        observer.onCompleted();
      }
});

observeOn类似于:

//Doesn't change when events get generated, simply reschedules them for down stream
source.subscribe(function(x) {
  scheduler.scheduleWithState(x, function(self, state) {
    observer.onNext(x);
  });
});