Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 为什么订阅Behavior Subject asObservable从不触发完成?_Angular_Rxjs_Observable_Behaviorsubject - Fatal编程技术网

Angular 为什么订阅Behavior Subject asObservable从不触发完成?

Angular 为什么订阅Behavior Subject asObservable从不触发完成?,angular,rxjs,observable,behaviorsubject,Angular,Rxjs,Observable,Behaviorsubject,我用的是有角度的。我有一个用于存储和从localstorage获取数据的服务。我正在将行为主体保存为可观察()。 代码如下: import { Injectable} from "@angular/core"; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; @Injectable() export class NavigationStorageService { ModuleTitle = new BehaviorSubj

我用的是有角度的。我有一个用于存储和从localstorage获取数据的服务。我正在将行为主体保存为可观察()。 代码如下:

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"));
}
我的问题是我想在可观测完成时执行其他函数,但这个可观测从未完成,所以我不能这样做

()=>console.log(“getModuleId”)未显示该消息

我怎样才能解决这个问题

在我的应用程序的另一部分,我使用Observable来获取HttpClient请求,它运行良好。我的意思是按它应该做的去完成火灾

我试过使用。finally()


但是它没有帮助。

您正在使用可观察对象。当您使用getModuleId()方法获取localStorage的一个项时,您立即拥有这个值,那么可观察对象就没有意义了

 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);
  }
}
从“@angular/core”导入{Injectable};
从'rxjs/BehaviorSubject'导入{BehaviorSubject};
@可注射()
导出类导航存储服务{
ModuleTitle=新行为主体(“”);
currentModuleTitle=this.ModuleTitle.asObservable();
构造函数(){}
setModuleId(ModuleId){
setItem('subModuleId',ModuleId)
}
getModuleId(id){
返回localStorage.getItem(id);
}
}

只有当您通过调用
complete()
告诉受试者完成时,他们才会完成

这里的问题是你想要实现什么。可能您永远不希望主题完成,因此您永远不会调用
this.ModuleTitle.complete()
,但您仍然希望向
currentModuleTitle
的“消费者”发送
complete
通知

currentModuleTitle = this.ModuleTitle.take(1);
这意味着您可以使用只获取一个值并立即完成链的
take(1)
运算符(无需使用
asObservable


现在,每次执行
currentModuleTitle.subscribe()
时,您都会立即收到一个值并完成。请注意,
BehaviorSubject
首先发出其存储的值,因此
currentModuleTitle
的所有使用者实际上将只接收缓存的值,而不接收进一步的更新。

我认为您必须手动调用complete,因为可观察对象不知道它何时完成。有关更多信息,请参阅。否则,当订阅由可观察对象传递的值时,只需调用所需的函数,如获得新值->调用该函数。这正是我需要的。谢谢
currentModuleTitle = this.ModuleTitle.take(1);