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

时间:2016-12-05 10:13:03

标签: javascript typescript rxjs rxjs5

在这段代码中:

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()观察者仍然会完成吗?看起来很奇怪,这根本不会发生。

1 个答案:

答案 0 :(得分:1)

这是对的。可观察的Observable.range(0,8)0开始计算,这就是"Item completed: 0"的原因。

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

这就是range()永远不会发出所有值的原因。 RangeObservable也被视为"感冒"可观察到它不会发出值,直到至少有一个订阅者。