将两个可观察的数组连接在一起

时间:2017-12-06 00:49:07

标签: angular typescript rxjs ionic3 angularfire2

checkAllThreads() {
    const userId = this.auth.getUser().uid;
    const buyerThreads = this.afs.collection('threads', ref => ref.where('buyerId', '==', userId)).valueChanges();
    const sellerThreads = this.afs.collection('threads', ref => ref.where('sellerId', '==', userId)).valueChanges();
    this.subscription = forkJoin(buyerThreads, sellerThreads)
      .map(([bT, sT]) => [...bT, ...sT])
      .subscribe(res=> { 
        console.log(res) //never console logs
        //logic to iterate through array, look for unread threads goes here
      });
  }

我使用AngularFire2在我的Firestore数据库中查询'线程中的所有文档。字段sellerIdbuyerId等于其userId的集合。根据我的理解,AngularFire2不允许您查询其中任何一个为真的所有文档;如果你链接他们的.where()方法,它将返回两个都为真的所有文件(在我的情况下将是0)。因此,我试图获取两个Observable数组并将它们组合在一个数组中,以便实时告诉用户他们是否有未读消息。

我尝试了上面的代码(改编自答案here),它在订阅方法中没有运行任何东西。据我所知,我认为这是因为我的观察结果尚未完成,因为我需要实时更新数据。有没有什么方法可以采用两个静态流可观察数组并将它们组合成一个,或者我必须找到另一种方法?

1 个答案:

答案 0 :(得分:0)

使用combineLatest代替forkJoin

所以它应该......

checkAllThreads() {
    const userId = this.auth.getUser().uid;
    const buyerThreads = this.afs.collection('threads', ref => ref.where('buyerId', '==', userId)).valueChanges();
    const sellerThreads = this.afs.collection('threads', ref => ref.where('sellerId', '==', userId)).valueChanges();
    this.subscription = Observable.combineLatest(buyerThreads, sellerThreads)
      .map(([bT, sT]) => [...bT, ...sT])
      .subscribe(res=> { 
        console.log(res);
      });
  }

您可能需要导入这两行。

import 'rxjs/add/observable/combineLatest';
import { Observable } from 'rxjs/Observable';