Rxjs “observeOn”和参数化调度程序之间的区别

Rxjs “observeOn”和参数化调度程序之间的区别,rxjs,Rxjs,我希望下面两段代码是等效的。默认情况下,Repeat使用currentThread调度程序。如果我们将其更改为立即计划程序: 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,…。但下面的代码没有

我希望下面两段代码是等效的。默认情况下,Repeat使用
currentThread
调度程序。如果我们将其更改为立即计划程序:

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,…
。但下面的代码没有,并生成一个混合值序列:

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
可以传递一个调度程序参数,但我想我也可以通过使用
observeOn
在特定的调度程序上强制执行Observable。我遗漏了什么?

区别在于一个是使用调度程序生成,另一个只是使用它进行传播

在第二个版本中,您仍然使用
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();
      }
});
//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);
  });
});

我想我明白你的意思。在这种情况下,对像
repeat
这样的操作员使用
observeOn
是没有用的,对吗?我不知道我会说“永不”。当然,很难看到在
currentThread
immediate
之间切换的用例,但是可能存在这样的情况:您希望从
currentThread
切换到
VirtualTimeScheduler
或在两个
VirtualTimeScheduler
之间切换,他们现在对
有不同的概念。