【问题标题】:Why the observer can see values generated by the Observable before it was subscribed to it为什么观察者可以在订阅 Observable 之前看到它生成的值
【发布时间】:2016-09-08 11:18:20
【问题描述】:

我想知道为什么在延迟 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);

【问题讨论】:

    标签: rxjs5


    【解决方案1】:

    Observables 默认是冷的。这意味着它们是惰性的,只是在观察者订阅它们时才变得活跃。

    你想要的是一个 hot observable。您可以通过在其上调用 publish() 并在热 observable 上调用 connect() 方法来使冷的 observable 变热。然后它开始发出值,而不管任何观察者。它还在观察者之间共享值,如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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      相关资源
      最近更新 更多