Rxjs Angular 9-BehaviorSubject服务于以前的值

Rxjs Angular 9-BehaviorSubject服务于以前的值,rxjs,angular9,Rxjs,Angular9,我试图提供一种通用的方法来获取数据并将数据分配给组件。我在玩弄一个行为学科目,因为我认为它是那个工作的合适人选。下面是一些代码: 服务: public listSubject: BehaviorSubject<any[]>; constructor(private service: someservice) { this.listSubject = new BehaviorSubject<any[]>([]); } public requestList(id:

我试图提供一种通用的方法来获取数据并将数据分配给组件。我在玩弄一个行为学科目,因为我认为它是那个工作的合适人选。下面是一些代码:

服务:

public listSubject: BehaviorSubject<any[]>;

constructor(private service: someservice) {
   this.listSubject = new BehaviorSubject<any[]>([]);
}

public requestList(id: number) {
this.someservice.get('url')
.subscribe(data => {
  this.listSubject.next([data]);
});
实施:

constructor(public service: AwaAlertsService) {
  // need full list first
  this.service.requestProjectList(1);
  this.list = this.service.projectList;
}

this.service.requestList(id);
this.list = this.service.list;
它可以工作,只是我得到了以前的值

知道我做错了什么吗


谢谢

至少在本例中,
BehaviorSubject
是多余的,因为您可以简单地将列表分配给一个属性,如
:Array
,它也可以这样做,而不会产生
rxjs
的开销

但是如果您将列表变成可观察的,那么
BehaviorSubject
就有意义了,因为现在它会在列表发生更改时发出通知,您可以在应用程序之间共享它

构造函数(私有服务:someservice){
this.listSubject=新行为主体(null);
}
公共获取列表$():可观察{
返回此.projectListSubject;
}
以及以后的组件代码或模板中

this.doSomething=service.list$.pipe(
// ....
);

{{item}}

我正在获取类型“Observable”缺少类型“any[]”中的以下属性:长度、弹出、在行上推送:this.doSomething=service.list$.pipe(取决于您如何定义
doSomething
的类型,在管道的情况下,它是
可观察的
。但是管道的概念是转换流中的数据,因为它不清楚您使用的是什么而不是
-很难猜测正确的类型。您可以将
可观察的
作为临时解决方案放在那里。我能够得到使用您所说的,通过类型错误。但是当我第一次运行这两行时:this.service.requestList(id);this.list=this.service.list;我得到空值,这是它第二次返回以前的值,依此类推。这就是我的回答的意思-在当前的实现中,没有理由使用
BeahaviorSubject
,因为它的值用作静态数据,而不是异步管道。要从中受益,需要连接它的流某处-到
管道
或通过
异步
管道到模板。我的想法是在请求此方法时:public requestList(id:number){this.someservice.get('url').subscribe(data=>{this.listSubject.next([data]);});它用最新的值填充BeahaviorSubject。然后,在实现中的任何地方,我都会得到它的值:this.service.projectList。我肯定我遗漏了什么。
constructor(public service: AwaAlertsService) {
  // need full list first
  this.service.requestProjectList(1);
  this.list = this.service.projectList;
}

this.service.requestList(id);
this.list = this.service.list;