N_d*_*ign 3 javascript observable rxjs firebase angular
我有一个用 firebase/fireStore 制作的 observable。如果我在组件中订阅这个 observable,它就可以工作。但是如果我通过管道传输这个 observable,即使我期望它也不起作用。我没有收到任何错误。我的问题; 为什么它不起作用?
我的代码;
服务;
getLastSeans(uid) {
return this.afs.doc<any>(`users/${uid}/lastseans/seansLive`).valueChanges();
}
Run Code Online (Sandbox Code Playgroud)
成分;
用管道它不起作用
this.roomService.getLastSeans(this.userId).pipe(map(x=>{console.log(x);return x;}));
Run Code Online (Sandbox Code Playgroud)
如果我订阅它,它会像这样工作;
this.roomService.getLastSeans(this.userId).subscribe(x=>console.log(x));
Run Code Online (Sandbox Code Playgroud)
我想了解为什么会发生这种情况?
根据文档,添加管道不会强制评估 observable,它会使用管道中定义的额外逻辑创建新的 observable 实例:
Pipeable Operator 是一个将 Observable 作为其输入并返回另一个 Observable 的函数
要评估新的 observable,您必须对其进行评估subscribe,例如使用以下.subscribe调用:
this.roomService.getLastSeans(this.userId)
.pipe(map(x=>{
console.log(x);
return x;
})).subscribe();
Run Code Online (Sandbox Code Playgroud)
请注意,.subscribe这里可以接受空,因为逻辑是在管道中定义的。
或者,更改模板以使用AsyncPipe,例如:
<app-live-sean *ngFor="let item of liveSeans | async"></app-live-sean>
Run Code Online (Sandbox Code Playgroud)
假设这liveSeans是组件的字段,它设置为
this.liveSeans = this.roomService.getLastSeans(this.userId)
.pipe(map(x=>{
console.log(x);
return x;
}));
Run Code Online (Sandbox Code Playgroud)
在这种情况下AsyncPipe将订阅它,接收结果并取消订阅 observable,保持内存安全无泄漏。
| 归档时间: |
|
| 查看次数: |
917 次 |
| 最近记录: |