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);
}