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

RxJS What difference with Scheduler.queue and null?

示例:

ob$.subscribeOn(Scheduler.queue) 
 .subscribe(() => {...})

ob$.subscribe(() => {...})

没有什么区别吧?

当您查看 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");
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>

使用此代码段:

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");
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>

请注意,两个片段 运行 是同步的。 queue 调度程序在未指定延迟时同步执行计划的操作。

在第一个片段中,可观察对象以深度优先的方式枚举。也就是说,在枚举来自可观察对象 bc 的值之前,将枚举来自源可观察对象 a 的所有值。这只会看到两个组合值与来自 ab 的最后一个值以及来自 c.

的两个值一起发出

但是,在第二个片段中,值以广度优先的方式枚举。也就是说,从 a 中枚举一个值,然后从 b 中枚举一个值,等等。这会看到更多的组合。

简而言之,queue 调度程序以这种方式运行,因为当一个动作被调度时,一个已经调度的动作正在执行,新调度的动作被排队。