繁体   English   中英

RxJS:forkJoin似乎不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM