我正在使用Angular。我有用于存储和从localstorage获取数据的服务。我正在保存BehaviorSubject asObservable()。 代码如下:
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永远不会完成所以我不能这样做。
()=&gt; console.log(“getModuleId”)未显示该消息。
我该如何解决这个问题?
在我的应用程序的另一部分,我使用Observable来获取HttpClient请求,它工作正常。我的意思是onComplete fires应该如此。
我尝试过使用.finally()
getModuleId() {
this._navigationStorageService.getModuleId()
.finally(() => console.log("getModuleId"))
.subscribe(
subModuleId => {
this.subModuleId = subModuleId
},
error => {
console.log(error)
},
() => console.log("getModuleId"));
}
但它没有帮助。
答案 0 :(得分:0)
您正在使用Observable对象。当您使用getModuleId()方法获取localStorage项时,您立即获得此值,那么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)
}
getModuleId(id) {
return localStorage.getItem(id);
}
}
答案 1 :(得分:0)
只有当您通过致电complete()
告诉他们完成时,主题才会完成。
这里的问题是你想要实现的目标。您可能永远不希望主题完成,因此您永远不会致电this.ModuleTitle.complete()
,但仍希望将complete
通知发送给currentModuleTitle
的“消费者”。
这意味着您可以使用只占一个值的take(1)
运算符并立即完成链(无需使用asObservable
)。
currentModuleTitle = this.ModuleTitle.take(1);
现在,每次执行currentModuleTitle.subscribe()
,您都会立即收到一个值并完成。请注意,BehaviorSubject
首先会释放其存储的值,因此currentModuleTitle
的所有使用者实际上只会收到缓存的值,而不会进一步更新。