【发布时间】:2017-10-25 23:55:19
【问题描述】:
我想我在 RxJS 库中发现了一个错误,或者只是无法理解它的行为。看看下面的代码:
const { Observable, Subject } = Rx;
const source$ = new Subject();
const handle = v => {
if (v === 0) {
source$.next(1);
return Observable.empty();
}
return Observable.interval(1000).startWith(-1).take(3);
}
source$
.do(e => console.log('source:', e))
// .delay(1)
// .switchMap(v => Observable.of(null).switchMap(() => handle(v)))
.switchMap(v => handle(v))
.subscribe(e => console.log('handle:', e))
source$.next(0); // <- initial value
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
工作场景:当我使用source$.next(1) 运行它时,我看到以下结果(正确):
source: 1
handle: -1
handle: 0
handle: 1
破碎场景:当我使用source$.next(0) 运行它时,我希望看到:
source: 0
... (exactly the same output as for the previous example)
但我只看到 3 个值:
source: 0
source: 1
handle: -1
解决方法 1: 当我在 cmets 中看到 .delay(1) 时 - 它工作正常,正如我所预期的那样。我认为这是因为默认调度程序在同一滴答声中同步执行,而在使用延迟时使用异步调度程序。
问题
当我使用Observable.of(null)(参见代码中的 cmets)时,它也给了我相同的(“正确”或预期的)结果。这是为什么?不应该和以前一样同步吗?
【问题讨论】:
-
这是非常极端的情况,另一种解决方法是
.empty().finally: plnkr.co/edit/cdmm9N3c0u4ZEHpOXaMc?p=preview