Observable未发射新值求助:重新赋值后无法接收新值
嘿,我来帮你搞定这个问题!你遇到的情况其实是RxJS里一个很常见的新手坑——你一直在替换Observable变量,但原来的订阅者根本没在听新的Observable。
问题根源
你一开始把dropDownValue$设为Observable.of(-1),这时候如果有代码订阅了它,只会收到-1这个值。之后你在actions$的订阅里重新给dropDownValue$赋值成新的Observable.of(...),但之前订阅了原dropDownValue$的代码,依然绑定在最初那个只发射-1的流上,完全不知道你换了新的流,自然收不到新值。
解决方案:用BehaviorSubject替代普通Observable
要解决这个问题,你需要用BehaviorSubject(因为你有初始值,它比普通Subject更合适)。它是多播的Observable,可以让所有订阅者都收到后续发射的新值,而不是每次都创建新的独立流。
具体代码调整如下:
- 重新定义变量:
// 用BehaviorSubject存储当前值,初始值设为你原来的-1 private dropDownValueSubject = new BehaviorSubject<number>(-1); // 对外暴露一个普通Observable,防止外部代码随意发射新值 dropDownValue$: Observable<number> = this.dropDownValueSubject.asObservable();
- 修改
actions$的订阅逻辑:
this.actions$.pipe(ofAction(UpdateFormValue)).subscribe((action: any) => { // 发射新值给所有订阅dropDownValue$的观察者 this.dropDownValueSubject.next(action.payload.value.data); });
为什么这样有效?
BehaviorSubject会一直保存当前的最新值,任何订阅dropDownValue$的代码,不管是在你发射新值之前还是之后订阅的,都会收到最新的那个值。而且你对外暴露的是asObservable()返回的普通Observable,外部代码只能订阅,不能随意调用next(),保证了数据流的可控性。
内容的提问来源于stack exchange,提问作者Sergino
相关产品推荐
相关产品推荐

