当前,我正在调用数据库以提取特定用户的所有对话。之后,我遍历这些对话,并从每个对话中提取元数据,例如消息文本,消息发件人等。
我为每个对象及其元数据创建了一个对象,然后将其全部存储在数组中-在我的情况下为this.recentChats
。
this.af.getObservable(`userChats/${this.userID}/`).pipe(
// we map the array of conversations to an array of the (before inner) observables
map(recentConversations =>
recentConversations.map(conversation =>
this.af.getObservableSortByVar(`allChats/${conversation.conversationID}/`, 'lastUpdate'))),
// combine the observables. will emit a new value of ALL conversation data when one of the conversations changes
switchMap(recentConversations => combineLatest(recentConversations)),
// map each conversation to the conversation object
map(conversations =>
conversations.map(conversationData => {
let userKey, lastMessage, lastMessageText, lastMessageSender, lastMessageDate;
for (let i = 0; conversationData.length > i; i++) {
switch (conversationData[i].key) {
case 'messages': {
lastMessage = (conversationData[i][Object.keys(conversationData[i])[Object.keys(conversationData[i]).length - 1]]);
lastMessageText = lastMessage.message;
lastMessageSender = lastMessage.sender;
lastMessageDate = lastMessage.date;
}
case 'users': {
userKey = conversationData[i].userKey;
}
}
}
return this.createConversationObject('username', userKey, lastMessageSender, lastMessageText, lastMessageDate);
}))
).subscribe(recentChats => this.recentChats = recentChats);
但是,在调用return this.createConversationObject('username', ...)
的那一行中,我一直在努力分配从数据库中获取的用户实际用户名。
基本上,我正在使用userKey
局部变量,该变量是从上面的转换案例代码获得的,以便尝试执行以下操作:
let tempUsername;
this.af.getUserName(userKey).then((username) => {
tempUsername = username;
}
然后在return语句中传递tempUsername
。但是,我一直在努力等待结果-为了在调用返回之前获取用户名。
有人对我如何正确获得预期结果有任何建议吗?
答案 0 :(得分:0)
编辑(在更深入地了解问题之后)
这是建议的解决方案的代码示例:Code example
这是需要对代码进行的修改:
在map(conversations =>
块中,返回添加了userkey
而不是this.createConversationObject()
在此之后引入switchMap
并使用rxjs -> from
运算符将Promise转换为Observable,还将先前map
操作返回的更新对象的结果转换为新的Observable使用rxjs -> of
运算符
现在返回CombineLatest(OriginalObservable, fromPromiseObservable)
最后,您还需要将这两个Observable返回的结果映射为直接在调用this.createConversationObject()
最后,您可以订阅结果以获取实际结果,作为最后一步
希望这可以澄清!
原始回复
这是我的建议:
this.af.getUserName(userKey)
将fromPromise
的诺言转换为可观察的。CombineLatest
块中现有SwitchMap
的用户名中使用此转换后的observable for用户名map
块中的转换和用户名来获取返回语句的用户名