【问题标题】:RXJS : Why do observers who subscribe after the value is emitted also recieve the value?RXJS:为什么在值发出后订阅的观察者也会收到值?
【发布时间】:2020-12-18 02:52:12
【问题描述】:
import { interval } from 'rxjs';
import {  take } from 'rxjs/operators'

const source$ = interval(1000).pipe(
  take(4),
);
source$.subscribe(value => console.log(`Observer 1: ${value}`));

setTimeout(() => {
  source$.subscribe(value => console.log(`Observer 3: ${value}`));
}, 3000);

所以,这里 Observer 3 在延迟 3 秒后订阅。

到那时,值 0, 1 已经发出。

但是,这是显示的输出。

Observer 3: 0
Observer 3: 1
Observer 3: 2
Observer 3: 3

观察者如何获得在订阅 observable 之前发出的值?

【问题讨论】:

    标签: typescript rxjs observable


    【解决方案1】:

    rxjs 中的 observable 有两种类型 - hot 和 cold,interval 是冷 observable。

    Cold observables 是数据生产者由 observable 本身创建的 observables。例如,使用 offromrangeintervaltimer 运算符创建的 observables 将是冷的。数据是从 observable 自身内部创建的,在订阅 observable 之前确实不会产生数据。

    当一个冷的 observable 有多个订阅者时,为每个订阅者重新发送整个数据流。每个订阅者都变得独立并获得自己的数据流

    您可以通过以下示例查看实际行为:

    const source$ = interval(1000).pipe(
      take(4),
      tap((v) => console.log(v)),
    );
    
    setTimeout(() => {
      source$.subscribe(value => console.log(`Observer 3: ${value}`));
    }, 3000);
    

    在您订阅 source$ 之前不会发出任何值!

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 2021-09-12
      • 2015-02-24
      相关资源
      最近更新 更多