forkJoin Firebase Observable 未完成

forkJoin Firebase Observable doesn't complete

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

我尝试应用 .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(来自数组)return 当我单独订阅它们时有些东西,但 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() return 是当前 Firebase 用户的可观察对象,然后我将其映射以获取 uid。

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

所以我 return 这些键最终将每个键映射到一个可观察到的 return 消息。

在有评论订阅后,他们 return 测试了一些东西。

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

我试过 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:

我的演示有效。

如果你用 .first() 绑定到 .valueChanges() 它永远不会发出任何东西,因为 valueChanges() 永远不会完成并且 .first() 运算符也不会(参见 ).

forkJoin 要求所有源 Observable 至少发出一项并完成,这应由 take(1) 保证(但前提是它们至少发出一项)。

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

我终于成功了... 我觉得自己很傻,却没有办法注意到它。

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

import { Observable } from 'rxjs/observable';

而不是

import { Observable } from 'rxjs/Observable';

(如果你没注意到少了一个大写)

我的 IDE 没有发出任何警告,而 observable 的任何其他功能都有效...

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

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

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