forkJoin Firebase Observable并没有完成

时间:2018-03-05 13:23:42

标签: angular firebase rxjs observable fork-join

所以我一直在尝试使用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(来自数组)在我单独订阅它们时会返回一些内容但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

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

我的演示工作。

2 个答案:

答案 0 :(得分:1)

如果您使用.valueChanges()绑定到.first(),它将永远不会发出任何内容,因为valueChanges()永远不会完成,.first()运算符也不会完成(请参阅Angular 2 using RxJS - take(1) vs first() )。

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

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

答案 1 :(得分:0)

我最终使它奏效了...... 我觉得很蠢,但没有办法注意到它。

好像我从:

导入了我的Observable

import { Observable } from 'rxjs/observable';

而不是

import { Observable } from 'rxjs/Observable';

(如果您没有注意到缺少资金)

我的IDE没有任何警告,而且观察到的任何其他功能都有效......

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

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

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