所以我一直在尝试使用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)
。
我已经尽力清楚但我很抱歉不要成为^^
and here is my log when the subscription is uncommented
更新
我试着在这里的stackBlitz上做一个演示
https://stackblitz.com/edit/angular-template-firebase-yvbkho
我复制并粘贴了大部分代码,并创建了另一个具有相同结构here的firebase数据库:
我的演示工作。
答案 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没有任何警告,而且观察到的任何其他功能都有效......
至少它是为其他人记录的。
感谢那些试图帮助我的人^^。
事情是没有任何警告或错误,它什么也没做。