为什么观察者可以在订阅之前看到 Observable 生成的值
Why the observer can see values generated by the Observable before it was subscribed to it
我想知道为什么在延迟 3200 秒后订阅这个 Observable 时,观察者会取他通常会错过的第一个值(从 0 到 2),而只是从值 3 开始:
const interval$ = Rx.Observable.interval(1000);
setTimeout(() => {
interval$.subscribe({
next : item => console.log("one.next : " + item),
error : error => console.log("one.error : " + error),
complete : () => console.log("one.complete")
});
}, 3200);
Observables 默认是冷的。这意味着它们是懒惰的,只有在观察者订阅它们时才会变得活跃。
你想要的是一个热的 Observable。您可以通过在其上调用 publish()
并在热可观察对象上调用 connect()
方法来使冷可观察对象变热。然后它开始发出值,而不管任何观察者。它还在观察者之间共享值,如 this fiddle.
中所示
另请参阅 this medium post by Ben Lesh,它解释了热和冷可观察量之间的差异。
完整代码:
const interval$ = Rx.Observable.interval(100);
const hotInterval$ = interval$.publish();
hotInterval$.connect();
setTimeout(() => {
hotInterval$
.take(5) // stop after five values for debugging purposes
.subscribe({
next : item => console.log("one.next : " + item),
error : error => console.log("one.error : " + error),
complete : () => console.log("one.complete")
})
}, 320);
setTimeout(() => {
hotInterval$
.take(5) // stop after five values for debugging purposes
.subscribe({
next : item => console.log("two.next : " + item),
error : error => console.log("two.error : " + error),
complete : () => console.log("two.complete")
})
}, 450);
我想知道为什么在延迟 3200 秒后订阅这个 Observable 时,观察者会取他通常会错过的第一个值(从 0 到 2),而只是从值 3 开始:
const interval$ = Rx.Observable.interval(1000);
setTimeout(() => {
interval$.subscribe({
next : item => console.log("one.next : " + item),
error : error => console.log("one.error : " + error),
complete : () => console.log("one.complete")
});
}, 3200);
Observables 默认是冷的。这意味着它们是懒惰的,只有在观察者订阅它们时才会变得活跃。
你想要的是一个热的 Observable。您可以通过在其上调用 publish()
并在热可观察对象上调用 connect()
方法来使冷可观察对象变热。然后它开始发出值,而不管任何观察者。它还在观察者之间共享值,如 this fiddle.
另请参阅 this medium post by Ben Lesh,它解释了热和冷可观察量之间的差异。
完整代码:
const interval$ = Rx.Observable.interval(100);
const hotInterval$ = interval$.publish();
hotInterval$.connect();
setTimeout(() => {
hotInterval$
.take(5) // stop after five values for debugging purposes
.subscribe({
next : item => console.log("one.next : " + item),
error : error => console.log("one.error : " + error),
complete : () => console.log("one.complete")
})
}, 320);
setTimeout(() => {
hotInterval$
.take(5) // stop after five values for debugging purposes
.subscribe({
next : item => console.log("two.next : " + item),
error : error => console.log("two.error : " + error),
complete : () => console.log("two.complete")
})
}, 450);