RxJS与Scheduler.queue和null有什么区别?

qua*_* li 2 rxjs rxjs5

在此输入图像描述

例:

ob$.subscribeOn(Scheduler.queue) 
 .subscribe(() => {...})
Run Code Online (Sandbox Code Playgroud)

要么

ob$.subscribe(() => {...})
Run Code Online (Sandbox Code Playgroud)

没什么区别吧?

car*_*ant 7

当您查看queue调度程序如何影响行为时,差异是显而易见的combineLatest.

比较此片段的行为,其中未null指定调度程序(即调度程序):

const a = Rx.Observable.of(1, 2);
const b = Rx.Observable.of(3, 4);
const c = Rx.Observable.of(5, 6);

console.log("before");
Rx.Observable
  .combineLatest(a, b, c)
  .subscribe(value => console.log(JSON.stringify(value)));
console.log("after");
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

有了这个片段:

const a = Rx.Observable.of(1, 2, Rx.Scheduler.queue);
const b = Rx.Observable.of(3, 4, Rx.Scheduler.queue);
const c = Rx.Observable.of(5, 6, Rx.Scheduler.queue);

console.log("before");
Rx.Observable
  .combineLatest(a, b, c, Rx.Scheduler.queue)
  .subscribe(value => console.log(JSON.stringify(value)));
console.log("after");
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

请注意,两个代码段都是同步运行的.queue当没有指定延迟时,调度程序同步执行调度的操作.

在第一个片段中,以深度优先的方式枚举了可观察量.也就是说,源observable a中的所有值都是在observable 的值之前枚举bc枚举的.这只能看到两个组合值与最后一个值ab来自的两个值一起发出c.

但是,在第二个片段中,值以广度优先的方式枚举.也就是说,从a后面跟着一个值来枚举一个值b,等等.这会发现更多的组合.

简而言之,queue调度程序的行为方式是这样的,因为当正在执行已调度的操作时调度操作时,新调度的操作将排队.