[英]RxJS: forkJoin seems not working
我目前正在使用combineLatest()
方法获取我所有的朋友,并将其作为列表。 但是,当我尝试从一开始删除项目时,就会产生订购问题。 (视图无法正确呈现)因此,我想从combineLatest()
切换到forkJoin()
来一次获取所有好友。
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/forkJoin';
friends$: Observable<User[]>;
getMyFriendList() {
this.friends$ = this.userService.getMyFriendsId().switchMap(friendKeys => {
return Observable.forkJoin(friendKeys.map(user => this.userService.getFriends(user.key)));
});
}
但是,当我调用forkJoin()时,什么也没有发生。 我在这里做错了什么?
getMyFriendsId() {
let friendRef = this.getFriendRef(this.currentUserId);
this.friends$ = friendRef.snapshotChanges().map(actions => {
return actions.map(a => ({ key: a.payload.doc.id, ...a.payload.doc.data()}));
});
return this.friends$;
}
getFriends(uid: string) {
return this.getUsersRef(uid).valueChanges();
}
编辑
当登录的用户从朋友列表中删除另一个用户时, getMyFriendsId()
更新新数据。
<ion-list>
<ion-list-header>Friends <span class="total-friends"></span></ion-list-header>
<ion-item-sliding *ngFor="let user of friends$ | async">
<ion-item *ngIf="user" (click)="viewUserProfile(user)">
<ion-avatar (click)="showOriginalAvatarImage()" item-start>
<img-loader [src]="user.thumbnailURL" [spinner]="true"></img-loader>
</ion-avatar>
<h2>{{user.displayName}}</h2>
<p>{{user.statusMessage}}</p>
</ion-item>
...
<ion-list>
生命周期事件
ionViewWillEnter() {
// Runs when the page is about to enter and become the active page.;
this.getMyFriendList();
}
.forkJoin()合并所有可观察对象,并且仅当所有可观察对象都为COMPLETED时才会发出值。 您的代码不起作用的原因是,您正在使用valueChanges()
,这是一种永远不会完成的事件-他们永远在听值的更改!
如果您真的想使用.forkJoin
(或证明要点),请在valueChanges
添加take(1)
:
getFriends(uid: string) {
return this.getUsersRef(uid).valueChanges().take(1);
}
上面的代码将起作用,因为它通过take()
强制完成了observable,但是显然将无法达到目的,因为您的代码将只起作用一次。 结论是,如果您要继续观察特定值的变化,然后将其与另一个可观察值组合,是的,请使用combineLatest()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.