【问题标题】:How is subscription being invoked?如何调用订阅?
【发布时间】:2019-09-03 14:17:44
【问题描述】:

我的服务包含以下内容:

  private menuBuilderCompleted: BehaviorSubject<any> = new BehaviorSubject({});
  menuBuilderCompleted$ = this.menuBuilderCompleted.asObservable();
  menuBuildComplete(data) {
    this.menuBuilderCompleted.next(data);
  }

在一个组件中我有以下订阅:

private subscription: Subscription = new Subscription();

然后使用:

this.subscription.add(this.headerService.menuBuilderCompleted$.subscribe((data) => {
  this.wasInComponent = false;
}));

我的问题是,当我在解决方案中搜索源代码时,我从未看到对 menuBuildComplete 的调用,但如果我在 menuBuilderCompelted$.subscribe 中添加调试器语句,我会看到它命中。如果我从不调用下一个,它怎么被调用?

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    BehaviorSubject 总是发出至少一个值。

    const a$ = new BehaviorSubject("Hello World");
    a$.subscribe(value => console.log(value)); // prints "Hello World"
    

    【讨论】:

    • 啊,好吧,这是有道理的!因此,即使从未调用它,它也会发出一些东西。只有在调用 next 时,Subject 才会调用,对吗?如果 next 不像 BehaviorSubject 那样被调用,则不会发出?
    • @Paritosh 不使用主题。如果没有任何订阅,主题将丢失最后发出的值。当您订阅一个组件时,您通常希望使用 BehaviorSubject 作为默认值,或者如果组件需要等待值准备好,则使用 ReplaySubject(1)。
    • “即使从未调用它也会发出一些东西”。它在内部保存this._value 并将第一个值设置为作为参数传递给构造函数的值。每次订阅发生时,该订阅都会收到this._value。因此,一旦订阅完成,它将立即向每个订阅发出当前的this._value将其视为杂志订阅,即使您在发布日期之后开始订阅,也会为您提供最新版本。
    【解决方案2】:

    相对于 Subject,BehaviorSubject 有一个“起始”值(在这种情况下,它将是一个空对象 {})。
    通过设置这个起始值,所有 BehaviorSubject 的订阅者都会收到这个起始值的通知。

    【讨论】:

      【解决方案3】:

      这是因为 BehaviorSubject 使用空对象初始化,因此订阅正在订阅该初始化值。

      如果你用一个字符串来初始化它,例如private menuBuilderCompleted: BehaviorSubject&lt;any&gt; = new BehaviorSubject('hello world');

      然后您会在控制台中看到 hello world 正在打印

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-17
        • 2020-02-25
        • 2020-07-30
        • 2022-01-19
        • 2021-05-06
        • 2012-03-14
        • 2015-08-24
        • 1970-01-01
        相关资源
        最近更新 更多