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
调度程序在未指定延迟时同步执行计划的操作。
在第一个片段中,可观察对象以深度优先的方式枚举。也就是说,在枚举来自可观察对象 b
和 c
的值之前,将枚举来自源可观察对象 a
的所有值。这只会看到两个组合值与来自 a
和 b
的最后一个值以及来自 c
.
的两个值一起发出
但是,在第二个片段中,值以广度优先的方式枚举。也就是说,从 a
中枚举一个值,然后从 b
中枚举一个值,等等。这会看到更多的组合。
简而言之,queue
调度程序以这种方式运行,因为当一个动作被调度时,一个已经调度的动作正在执行,新调度的动作被排队。
示例:
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
调度程序在未指定延迟时同步执行计划的操作。
在第一个片段中,可观察对象以深度优先的方式枚举。也就是说,在枚举来自可观察对象 b
和 c
的值之前,将枚举来自源可观察对象 a
的所有值。这只会看到两个组合值与来自 a
和 b
的最后一个值以及来自 c
.
但是,在第二个片段中,值以广度优先的方式枚举。也就是说,从 a
中枚举一个值,然后从 b
中枚举一个值,等等。这会看到更多的组合。
简而言之,queue
调度程序以这种方式运行,因为当一个动作被调度时,一个已经调度的动作正在执行,新调度的动作被排队。