所以我一直在尝试使用带有来自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)
。
我已经尽力明白,但我很抱歉不要成为^^
and here is my log when the subscription is uncommented
更多更新
好吧,我试着在stackBlitz上做一个演示
https://stackblitz.com/edit/angular-template-firebase-yvbkho
我复制并粘贴了大部分代码,并创建了另一个具有相同结构的firebase数据库here:
我的演示工作。
如果你用.valueChanges()
与.first()
绑定它将永远不会发出任何东西,因为valueChanges()
永远不会完成而且.first()
运算符也不会(参见Angular 2 using RxJS - take(1) vs first())。
forkJoin
要求所有源Observable发出至少一个项目并完成哪个应该由take(1)
保证(但仅当它们发出至少一个项目时)。
take(1)
应该假设valueChanges()
发出至少一个项目,因为它在重新发送值后立即完成。
我终于让它工作了......我觉得很愚蠢而且没有办法注意到它。
好像我从以下位置导入了我的Observable:
import { Observable } from 'rxjs/observable';
代替
import { Observable } from 'rxjs/Observable';
(如果你没有注意到资金缺失)
我的IDE没有任何警告,可观察到的任何其他功能......
至少它是为其他人记录的。
感谢那些试图帮助我的人^^。
问题是没有任何警告或错误,它什么也没做。