Rxjs doOnCompleted() 在 take() 之前没有触发

Rxjs doOnCompleted() not firing before a take()

在这段代码中:

Rx.Observable.range(0,8)
    .doOnCompleted(() => console.log("range complete"))
    .take(1)
    .subscribe(
        item => console.log(`Item completed: ${item}`),
        error => console.log(`Error: ${error}`),
        () => console.log(`all complete`)
    );

JSBin

我得到输出:

"Item completed: 0"
"all complete"

没有range complete

这是为什么? range() 可观察对象肯定会完成吗?这一点都不火似乎很奇怪。

这是正确的。 Observable Observable.range(0,8)0 开始计数,这就是你得到 "Item completed: 0".

的原因

然后 take(1) 运算符仅传递一个值并发送导致取消订阅的完成信号。我想这就是它发生的地方:https://github.com/ReactiveX/rxjs/blob/master/src/Subscriber.ts#L119 and https://github.com/ReactiveX/rxjs/blob/master/src/Subscriber.ts#L143

这就是为什么 range() 从不发出所有值的原因。 RangeObservable 也被认为是 "Cold" 可观察的,因此在至少有一个订阅者之前它不会发出值。