【问题标题】:AgularFire Combine 2 streamsAgularFire 结合 2 个流
【发布时间】:2020-03-08 14:51:49
【问题描述】:

我正在尝试使用 AngularFire 合并来自 Firebase 的 2 个数据流,但我遇到了困难。

我有一个名为 incomeShops 的集合,其中包含创建该特定记录的 userID 的引用。我需要做的是再次调用以获取用户的数据,但我不能。

有什么帮助吗?

这是我所拥有的:


getAllIncomeShops() {
    const shops = this.venueService.getIncomeShops()
        .snapshotChanges()
        .pipe(
            switchMap(incomeShopSnaps => {
                // Mapping the result to extract the data I need using snapshotchanges().
                return incomeShopSnaps.map(incomeShopSnap => {
                    const shopObject = {
                        id: incomeShopSnap.payload.doc.id,
                        ...incomeShopSnap.payload.doc.data()
                    };
                    // On the shopObject there is a property called suggestedBy which contains a STRING with the user's ID.
                    // Trying to fetch the user's data to insert on the shopObject.
                    this.userService.getUser(shopObject.suggestedBy).valueChanges()
                });
            })
        ).subscribe(data => {
            console.log(data);
        });
}

【问题讨论】:

  • 那么对于每个incomeShopSnaps,您想提出一个单独的请求吗?
  • 嘿@martin 是的!

标签: firebase rxjs angularfire2


【解决方案1】:

您可以创建一组 observables 并等待它们全部使用forkJoin() 完成。

switchMap(incomeShopSnaps => {
  // Mapping the result to extract the data I need using snapshotchanges().
  const requests = incomeShopSnaps.map(incomeShopSnap => {
    const shopObject = {
      id: incomeShopSnap.payload.doc.id,
      ...incomeShopSnap.payload.doc.data()
    };
    // On the shopObject there is a property called suggestedBy which contains a STRING with the user's ID.
    // Trying to fetch the user's data to insert on the shopObject.
    return this.userService.getUser(shopObject.suggestedBy).valueChanges()
  });

  return forkJoin(requests); // You can eventually `map()` results into something...
}),

【讨论】:

  • 谢谢,但在这种情况下,我应该在哪里映射结果?我只是尝试了代码,但没有任何安慰:(
  • forkJoin 要求所有源 observables 至少发射一次并完成。那么你确定所有.valueChanges() 都完成了吗?也许你需要用take(1)链接他们每个人
  • 嘿马丁,对不起,这还不清楚。 The valueChanges() 将返回一个 Observable 应该没问题吧?有没有办法检查它是否完成?在这种情况下,take(1) 应该在switchmap 之后吗?
  • take(1) 追随每个valueChanges 所以valueChanges().pipe(take(1))。您可以使用tap({ complete: () => { ... }) 来查看它们是否完成。
  • 您在incomeShopSnaps.map() 中缺少return
猜你喜欢
  • 2021-08-28
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多