【发布时间】:2019-05-03 07:32:28
【问题描述】:
我在 Angular (7) 应用程序中遇到了 BehaviorSubject 的奇怪行为。
我创建了一个服务,它消耗一些休息调用。要描绘代码中发生的情况,您可以:
export class MyService {
private dataFromServer = new BehaviorSubject<IDataFromServer[]>(null);
constructor(private http: HttpClient) { }
getAll(): Observable<IDataFromServer[]> {
this.http.get<IDataFromServer[]>('/api/rest')
.pipe(
tap(data => this.dataFromServer.next(data))
);
}
return this.dataFromServer.asObservable();
}
到目前为止一切顺利。当我需要使用该服务时,我订阅了 getAll() 方法,例如
this.myService.getAll().subscribe(console.log);
并将数据打印到控制台。
现在我必须将数据从前端添加到其余 api
export class MyService {
private dataFromServer = new BehaviorSubject<IDataFromServer[]>(null);
// snip...
add(item: IDataFromServer): Observable<any> {
return this.http.post<IDataFromServer>('/api/manage', item).pipe(
tap(data => {
let internal = this.dataFromServer.getValue();
if (!internal) {
internal = new Array<IDataFromServer>();
}
internal.push(material);
this.dataFromServer.next(internal);
})
);
}
}
这就是麻烦的开始。上面的订阅第一次打印,但是没有收到next()触发的新数据。
让我感到困惑的是,如果我在浏览器上点击刷新,而不更改任何代码行,每次点击 next() 时订阅都会恢复。
我显然做错了什么,但我不明白为什么以及在哪里。
感谢您的任何帮助。
【问题讨论】:
-
add在哪里调用?请将此包含在您的 sn-ps 中 -
在您的后一个 sn-p 中,似乎没有人订阅
BehaviorSubject的事实似乎很可疑。 -
从您的代码中可以看出您订阅了
add方法,而不是dataFromServer,因为它是私有的,您将无法从内部订阅它.. -
确实如此,
getAll似乎返回了主题,但是该函数中的大括号必须放错了位置。 -
没有看到,我猜
add的结果没有被订阅。因此,tap永远不会被调用。
标签: angular typescript rxjs