在这段代码中:
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`)
);
我得到了输出:
"Item completed: 0"
"all complete"
没有range complete
这是为什么?当然range()
观察者仍然会完成吗?看起来很奇怪,这根本不会发生。
答案 0 :(得分:1)
这是对的。可观察的Observable.range(0,8)
从0
开始计算,这就是"Item completed: 0"
的原因。
然后take(1)
运算符只传递一个值并发送导致取消订阅的完整信号。我认为这就是它发生的地方:https://github.com/ReactiveX/rxjs/blob/master/src/Subscriber.ts#L119和https://github.com/ReactiveX/rxjs/blob/master/src/Subscriber.ts#L143
这就是range()
永远不会发出所有值的原因。 RangeObservable
也被视为"感冒"可观察到它不会发出值,直到至少有一个订阅者。