代码之家  ›  专栏  ›  技术社区  ›  Mac_W

BehaviorSubject订阅服务器多次获取相同的next()元素

  •  0
  • Mac_W  · 技术社区  · 6 年前

    我正在使用sharedata服务 行为主体 就像下面的那个。我的问题是每次我打电话给服务部 更改消息 方法从一个组件侦听器 消息源 任何其他组件中的订阅都会被多次调用,看起来它多次收到相同的消息。这是预期行为吗?如何预防?

    服务是单人的。 我不打电话 更改消息 多次

    @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
            }
        });
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Jeffrey Roosendaal SReddy    6 年前

    每次添加新订阅 ngDoCheck() 被调用。尝试使用 first() 只获取一次值,然后自动取消订阅。

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

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


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

    get() {
        return this.messageSource.getValue();
    }
    
        2
  •  0
  •   David R    6 年前

    你能试着打电话给 unsubscribe 在你的 ngOnDestroy() 生命周期挂钩

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

    希望这有帮助!