BehaviorSubject 订阅者多次获得相同的 next() 元素

Mac*_*c_W 3 subscribe rxjs behaviorsubject angular

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

该服务是一个单身人士。我不会多次调用changeMes​​sage

@Injectable()
export class ShareDataService {

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

}
Run Code Online (Sandbox Code Playgroud)

组件中的订阅

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

Jef*_*aal 6

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

ngDoCheck() {
    this.shareDataService.currentMessage
        .pipe(first())
        .subscribe((message) => {
            // Do stuff
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

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


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

get() {
    return this.messageSource.getValue();
}
Run Code Online (Sandbox Code Playgroud)