【问题标题】:BehaviorSubject subscriber gets same next() element multiple timesBehaviorSubject 订阅者多次获得相同的 next() 元素
【发布时间】:2018-07-23 11:54:03
【问题描述】:

我正在使用使用 BehaviorSubject 的 shareDataService,如下所示。我的问题是,每次我调用服务的 next() 方法时,任何其他组件中的侦听器订阅都会被调用多次,看起来它多次收到相同的消息。这是预期的行为吗?如何预防?

服务是单例的。 我不会多次调用 changeMes​​sage

@Injectable()
export class ShareDataService {

    messageSource = new BehaviorSubject(someData);
    currentMessage: Observable = this.messageSource.asObservable();
    changeMessage(message) {
        this.messageSource.next(message);
    }

}

在组件中订阅

ngDoCheck() {
    this.shareDataService.currentMessage
        .pipe(takeUntil(this.ngUnsubscribe))
        .subscribe((message) => {
            //Do stuff
        }
    });
}

【问题讨论】:

  • 你能记录下所有订阅成功回调的顺序并告诉我们吗? BehaviorSubject 应该发出最后一个(以前发出的数据和当前发出的数据)但只是为了确保请显示将包含所有成功回调发生的日志
  • next(...) 将值发送给所有观察者(订阅者)。您可能会在同一个组件中创建多个订阅。
  • 你能把代码贴在你实际订阅的地方吗?
  • @DavidR - 刚刚添加
  • @martin - 你是什么意思?我只在多个组件中订阅一次

标签: angular rxjs subscribe behaviorsubject


【解决方案1】:

每次调用 ngDoCheck() 时都会添加一个新订阅。尝试使用first() 只获取一次值,然后自动退订。

ngDoCheck() {
    this.shareDataService.currentMessage
        .pipe(first())
        .subscribe((message) => {
            // Do stuff
        }
    });
}

下次触发ngDoCheck时,会添加另一个一次性订阅。


如果您订阅的唯一目的是获取更改检测的当前值,您还可以向 ShareDataService 添加一个简单的 get() 函数以仅返回其当前值。

get() {
    return this.messageSource.getValue();
}

【讨论】:

  • 我现在有什么问题!它现在正在发送多条消息,它只是在更改检测时触发!
  • @Willys 我认为,因为两者都有有效订阅,所以当其中一个触发 next() 时。两个订阅都触发,并导致两个 reloads() 触发(再次)。
  • @JeffreyRoosendaal 感谢您的回复。关于该问题的解决方案如何?我为每种方法创建了主题并获取事件,但我不确定这是否是个好主意?您能否就该问题发表您的建议?
【解决方案2】:

您能否尝试在您的ngOnDestroy() 生命周期挂钩中调用unsubscribe

ngOnDestroy() {
    this.shareDataService.currentMessage.unsubscribe();
}

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    我也遇到了类似的问题,我发现我没有销毁我的next()

    请检查以下代码并将其添加到您的onDestroy。希望对你有帮助!

    ngOnDestroy() { this.messageSource.next(); }

    万事如意!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2017-01-10
      • 2018-12-21
      相关资源
      最近更新 更多