forkJoin Firebase Observable无法完成

问题描述 投票:1回答:2

所以我一直在尝试使用带有来自firebase的Observable数组的forkJoin,但似乎它们没有完成。

我试图应用.first().take(1),因为它应该完成可观察但它似乎没有改变任何东西。

getChat(userTwoId: string)
{
return this.auth.getAuthenticatedUser()
  .map(auth => 
  {
    console.log(auth.uid);
    return auth.uid;
  })
  .mergeMap(uid => 
  {
    console.log(`/user-messages/${uid}/${userTwoId}/`); 
    return this.database.list(`/user-messages/${uid}/${userTwoId}/`).snapshotChanges();
  })
  .mergeMap(chats => 
  {
    const oChats = chats.map(chat=>
    {
      console.log(`/messages/${chat.key}`);
      return this.database.object(`/messages/${chat.key}`).valueChanges().first();
    });

    console.log('ObsevableMap');
    console.log(oChats);

    return Observable.forkJoin(oChats);

  });
}

当我单独订阅它们时,我的Observables(来自数组)会返回一些内容,但forkJoin却没有。

所以我已经看到Firebase Observable从未完成的某个地方。如果这是真的,那将是最好的选择。如果不是什么会完成它们?是不是有办法迫使他们完成?

更多细节:所以这里是我试图测试的代码:

this.auth.getAuthenticatedUser()
      .map(auth => 
      {
        return auth.uid;
      })
      .mergeMap(uid => 
      {
        console.log('path to list of keys:')
        console.log(`/user-messages/${uid}/${userTwoId}/`); 
        return this.database.list(`/user-messages/${uid}/${userTwoId}/`).snapshotChanges();
      })
      .mergeMap(chats => 
      {
        console.log('Log each path to object:');
        const oChats = chats.map(chat=>
        {
          console.log(`/messages/${chat.key}`);
          return this.database.object(`/messages/${chat.key}`).valueChanges().take(1);
        });

        //See if its log 
        //console.log('Log each Obs subscription:')
        //oChats.forEach(a=>{a.subscribe(b=>{console.log(b)})});

        return Observable.forkJoin(oChats);

      }).subscribe(vals=>
      {
        console.log('Fork Subscription:');
        console.log(vals)
      });

this.auth.getAuthenticatedUser()返回当前Firebase用户的可观察对象,然后我将其映射以获取uid。

在我的数据库中,有一个节点以用户uid开头,然后是第二个用户uid,然后是他们彼此发送的消息密钥列表。

所以我将这些键返回到finnaly将每个键映射到一个返回其消息的observable。

在有评论订阅后测试返回的东西。

然后我尝试分叉或合并它们,但是当我订阅时没有任何反应。

我试过first()而不是take(1)

我已经尽力明白,但我很抱歉不要成为^^

here are the messages

here are the lists of keys

and here is my log when the subscription is uncommented

更多更新

好吧,我试着在stackBlitz上做一个演示

https://stackblitz.com/edit/angular-template-firebase-yvbkho

我复制并粘贴了大部分代码,并创建了另一个具有相同结构的firebase数据库here

我的演示工作。

angular firebase rxjs observable fork-join
2个回答
1
投票

如果你用.valueChanges().first()绑定它将永远不会发出任何东西,因为valueChanges()永远不会完成而且.first()运算符也不会(参见Angular 2 using RxJS - take(1) vs first())。

forkJoin要求所有源Observable发出至少一个项目并完成哪个应该由take(1)保证(但仅当它们发出至少一个项目时)。

take(1)应该假设valueChanges()发出至少一个项目,因为它在重新发送值后立即完成。


0
投票

我终于让它工作了......我觉得很愚蠢而且没有办法注意到它。

好像我从以下位置导入了我的Observable:

import { Observable } from 'rxjs/observable';

代替

import { Observable } from 'rxjs/Observable';

(如果你没有注意到资金缺失)

我的IDE没有任何警告,可观察到的任何其他功能......

至少它是为其他人记录的。

感谢那些试图帮助我的人^^。

问题是没有任何警告或错误,它什么也没做。

© www.soinside.com 2019 - 2024. All rights reserved.