Angular 角度-结合观测值和承诺
目前,我正在调用数据库来提取特定用户的所有对话。之后,我循环这些对话,并从每个对话中提取元数据,如消息文本、消息发送者等。 我为每个对象创建了一个对象,其元数据都存储在一个数组中——在我的例子中是Angular 角度-结合观测值和承诺,angular,firebase-realtime-database,promise,observable,angularfire2,Angular,Firebase Realtime Database,Promise,Observable,Angularfire2,目前,我正在调用数据库来提取特定用户的所有对话。之后,我循环这些对话,并从每个对话中提取元数据,如消息文本、消息发送者等。 我为每个对象创建了一个对象,其元数据都存储在一个数组中——在我的例子中是this.recentChats this.af.getObservable(`userChats/${this.userID}/`).pipe( // we map the array of conversations to an array of the (before inner) obser
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);
然而,在调用返回this.createConversationObject('username',…)
的那一行,我一直在努力分配从数据库获取的用户的实际用户名
基本上,我正在使用从上述开关案例代码中获取的userKey
局部变量,以尝试执行以下操作:
let tempUsername;
this.af.getUserName(userKey).then((username) => {
tempUsername = username;
}
然后在return语句中传递tempUsername
。然而,我一直在努力使结果等待-为了获取用户名,在调用返回之前
有人对我如何正确地达到预期的结果有什么建议吗?编辑(在更仔细地了解问题之后)
以下是建议解决方案的代码示例:
以下是需要对代码进行的修改:
- 在
块中,返回附加了map(conversations=>
的修改对象,而不是userkey
this.createConversationObject()的结果
- 在此之后引入
,并使用switchMap
操作符将承诺转换为可观察的,同时使用rxjs->from
操作符将先前rxjs->of
操作返回的更新对象的结果转换为新的可观察的map
- 现在返回组合测试的结果(OriginalObservable,fromPromiseObservable)
- 最后,您还需要将这两个可观察返回的结果映射到其中一个,并在对
this.createConversationObject()的调用中直接使用它
- 最后,您可以订阅结果以获得实际结果作为最后一步
- 您可以先使用rxjs提供的
将fromPromise
promise转换为可观察的this.af.getUserName(userKey)
- 然后在
块中现有的SwitchMap
中使用此转换后的可观察用户名combinelatetest
- 最后,在
块中使用转换和用户名的结果来获取return语句的用户名map
userKey
局部变量是在map(conversations=>
块中定义的。因此,基本上,我不能在它之前使用它。你对我如何处理它有什么建议吗?只是想更清楚地理解它:在你的映射中(conversations=>
块,使用开关->case
获取userkey
,并使用此承诺代码从createConversationObject(..)中的userkey
获取用户)
method?正确!获取userKey
后,我想在promise中使用它,以便对数据库进行新调用并检索用户名。检索名称后,我想将其传递给createConversationObject(…)
.cool。所以本质上,您不应该在映射中调用createConversationObject
(conversations=>
块,因为您的createConversationObject
将是链中的最后一步;您应该在末尾执行此操作。但首先,您应该使用用户密钥返回映射数据。在现有块之后引入另一个映射
块,并添加转换为可观察返回的promise块。您可能需要在链中的这之后添加一个过滤器
,以便仅当承诺返回用户名
时才能调用createConversationObject
。没有问题,请给我一些时间,我可能会根据我们之前的讨论编辑我的上述答案。isthis.af.getObservableSortByVar()
是否也返回一个可观察的?