为什么观察者可以在订阅它之前看到Observable生成的值

时间:2016-09-08 11:18:21

标签: rxjs5

我想知道为什么在延迟3200s之后订阅此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);

1 个答案:

答案 0 :(得分:1)

默认情况下,Observable很冷。这意味着它们是懒惰的,只有在Observer订阅它们时才会变为活动状态。

你想要的是一个热门观察。您可以通过调用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);