【问题标题】:Is there any way to check if source is subscribed?有没有办法检查源是否被订阅?
【发布时间】:2018-01-09 10:58:26
【问题描述】:

正如标题所说,在 Angular 2 中,有没有办法检查源是否已经订阅?因为我必须在使用前检查它

this.subscription.unsubscribe();

这是我的代码:

this.Source = Rx.Observable.timer(startTime, 60000).timeInterval().pluck('interval');

this.Subscription = this.Source
  .subscribe(data => { something }

然后我想在调用unsubscribe()之前确保它已被订阅

【问题讨论】:

  • 你想检查 Observable 是否有观察者?
  • 是的,就是这样
  • 目前还不清楚您为什么要在致电unsubscribe 之前检查订阅。您始终可以使用空订阅实例初始化您的订阅,例如this.subscription = Subscription.EMPTY,在上面调用unsubscribe 是安全的。

标签: javascript angular typescript rxjs5


【解决方案1】:

你可以检查Subject是否有观察者,因为它有一个公共属性observers

Observables 不能,因为它们通常没有观察者数组。仅当您通过 Subject 使用 multicast() 运算符对它们进行多播时。

如果您能更详细地描述您的用例,我可能会给您更好的建议。

const source = ...;
let subscribed = false;

Rx.Observable.defer(() => {
    subscribed = true;
    return source.finally(() => { subscribed = false });
})

【讨论】:

  • 仅当您已进行多播时 - 但实际上仍会返回主题,对吗?
【解决方案2】:

正如我在您的代码中看到的,您总是创建订阅。

因此,如果您创建了订阅对象,则意味着订阅存在并且您可以取消订阅。

还有点不清楚为什么你需要检查是否存在任何小节

顺便说一句。 unsubscribe() 方法检查订阅是否关闭。 如果有人调用 unsubscribe() 或 observable 完成,则订阅关闭

【讨论】:

    【解决方案3】:

    我有一个类似的情况,我有一个带有一个可选订阅的 if 条件:

    if (languageIsSet) {
       // do things...
    } else {
       this.langSub = this.langService.subscribe(lang => { 
          // do things...
       });
    }
    

    如果你想安全地调用 unsubscribe(你不知道是否被订阅),只需使用 EMPTY 实例初始化订阅:

    private langSub: Subscription = Subscription.EMPTY;
    

    现在您可以毫无错误地取消订阅。

    【讨论】:

      【解决方案4】:

      看来你可以检查订阅是否关闭

      this.subscription.closed
      

      指示此订阅是否已取消订阅。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-24
        • 2022-06-10
        • 1970-01-01
        • 2016-06-04
        • 2012-12-23
        • 1970-01-01
        相关资源
        最近更新 更多