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 的任何其他功能都有效...
至少它是为其他人记录的。
感谢那些试图帮助我的人^^。
问题是没有警告或错误,它什么也不做。
所以我一直在尝试将 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 的任何其他功能都有效...
至少它是为其他人记录的。
感谢那些试图帮助我的人^^。
问题是没有警告或错误,它什么也不做。