angular - 为什么订阅 BehaviourSubject asObservable 永远不会触发 onComplete?
问题描述
我正在使用角。我有用于存储和从本地存储中获取数据的服务。我将 BehaviorSubject 保存为 Observable()。下面的代码:
import { Injectable} from "@angular/core";
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
@Injectable()
export class NavigationStorageService {
ModuleTitle = new BehaviorSubject<string>("");
currentModuleTitle = this.ModuleTitle.asObservable();
constructor() {}
setModuleId(ModuleId) {
localStorage.setItem('subModuleId', ModuleId)
this.ModuleTitle.next(ModuleId);
}
getModuleId() {
this.ModuleTitle.next(localStorage.getItem('subModuleId'));
return this.currentModuleTitle;
}
}
接下来,我将使用以下代码获取此数据:
getModuleId() {
this._navigationStorageService.getModuleId()
.subscribe(
subModuleId => {
this.subModuleId = subModuleId
},
error => {
console.log(error)
},
() => console.log("getModuleId"));
}
我的问题是我想在 observable 完成时执行其他功能,但是这个 observable 永远不会完成,所以我不能这样做。
() => console.log("getModuleId") 没有显示消息。
我该如何解决这个问题?
在我的应用程序的另一部分,我使用 Observable 来获取 HttpClient 请求,它工作正常。我的意思是 onComplete 火灾应该如此。
我试过使用 .finally()
getModuleId() {
this._navigationStorageService.getModuleId()
.finally(() => console.log("getModuleId"))
.subscribe(
subModuleId => {
this.subModuleId = subModuleId
},
error => {
console.log(error)
},
() => console.log("getModuleId"));
}
但这无济于事。
解决方案
只有当您通过调用 告诉他们完成时,主题才会完成complete()
。
这里的问题是您要实现的目标。您可能永远不希望主题完成,因此您永远不会打电话this.ModuleTitle.complete()
,但您仍想将complete
通知发送给currentModuleTitle
.
这意味着您可以使用take(1)
只取一个值并立即完成链的运算符(无需使用asObservable
)。
currentModuleTitle = this.ModuleTitle.take(1);
现在,每次您这样做时,currentModuleTitle.subscribe()
您都会立即收到一个完整的值。请注意,BehaviorSubject
首先发出其存储的值,因此所有消费者currentModuleTitle
实际上只会收到缓存的值,而不会进一步更新。
推荐阅读
- ocaml - 如何在 ocaml lambda 中创建自由变量检查功能
- android - 有没有办法访问安卓设备的电源配置文件?
- git - Gitlab:什么是在合并结果管道之后运行的合并训练管道
- azure - 在 azure 中创建主机池时出现 ErrorLoadingExtensionAndDefinition 错误
- javascript - Knex bulk insert not waiting for it to finish before passing to the next async operation
- angular - How to use role in authguard to protect routes?
- gitignore - 我可以将 .gitignore 与 TFVC 一起使用吗?
- javascript - innerHTML but with multiple options to choose from
- paypal - Paypal smart button - Error scenario testing
- java - Executor service threads, some local connection object