Javascript RxJS:forkJoin似乎不起作用
我目前正在使用Javascript RxJS:forkJoin似乎不起作用,javascript,typescript,rxjs,Javascript,Typescript,Rxjs,我目前正在使用combineLatest()方法获取我所有的朋友并将其列为列表。但是,当我尝试从一开始删除一个项目时,它会产生一个排序问题。(视图渲染不正确)因此,我想从combinelateest()切换到forkJoin(),一次获得所有的朋友 import { Observable } from 'rxjs/Observable'; import 'rxjs/add/observable/forkJoin'; friends$: Observable<User[]>; ge
combineLatest()
方法获取我所有的朋友并将其列为列表。但是,当我尝试从一开始删除一个项目时,它会产生一个排序问题。(视图渲染不正确)因此,我想从combinelateest()
切换到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)));
});
}
编辑
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>
组合所有观察值,并且仅当所有观察值均完成时才会发出值。代码无法工作的原因是因为您使用的是valueChanges()
,而这是一种永远不会完成的事件类型——他们永远都在监听值的更改
如果您确实想使用.forkJoin
(或为了证明这一点),请在值更改中添加take(1)
:
getFriends(uid: string) {
return this.getUsersRef(uid).valueChanges().take(1);
}
上面的代码可以工作,因为它通过take()
强制地完成了可观察的,但显然会失败,因为您的代码只能工作一次。结论是,如果您想继续观察某个特定值的变化,并将其与另一个可观察值相结合,那么可以使用combineLatest()
我不知道您是如何使用/调用getMyFriendList()的
但是如果你每次都给这个.friends$
分配一个新的引用,这不是一个好主意,你应该看看我回答的一个类似的问题:@Maxime我目前正在使用Ionic framework,并在ionViewWillEnter()中调用getMyFriendList(),这是一个生命周期事件。当页面即将进入并成为活动页面时运行。我做错什么了吗?你读了我在上一个答案中复制的链接的答案了吗?@Maxime是的,我读了你的帖子,并对其进行了投票。我学到了一些以前都不知道的东西。但我还是有点困惑:(多久会调用一次getMyFriendList
?谢谢你,@CozyAzure。答案确实非常清楚!我应该坚持使用CombineRelatest()
。我已经在中发布了我当前的问题。你能告诉我为什么会发生这种情况以及我如何解决这个问题吗?
ionViewWillEnter() {
// Runs when the page is about to enter and become the active page.;
this.getMyFriendList();
}
getFriends(uid: string) {
return this.getUsersRef(uid).valueChanges().take(1);
}