gpt4 book ai didi

Angular - 将 Observables 与 promise 相结合

转载 作者:行者123 更新时间:2023-12-05 06:32:12 24 4
gpt4 key购买 nike

目前,我正在调用数据库以提取特定用户的所有对话。之后,我循环浏览这些对话,并从每个对话中提取消息文本、消息发件人等元数据。我用它的元数据为每个对象创建了一个对象,然后所有这些元数据都存储在一个数组中——在我的例子中是 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', ...) 的行中,我一直在努力分配从数据库中获取的用户的实际用户名。

基本上,我正在使用从上面的 switch-case 代码中获得的 userKey 局部变量,以尝试执行以下操作:

let tempUsername;
this.af.getUserName(userKey).then((username) => {
tempUsername = username;
}

然后在返回语句中传递tempUsername。但是,我一直在努力让结果等待 - 为了在调用返回之前获取用户名。

有没有人有任何建议,我怎样才能正确地达到预期的结果?

最佳答案

编辑(在更深入地了解问题之后)

这是建议解决方案的代码示例:Code example

以下是需要对您的代码进行的修改:

  • map(conversations => block ,用 userkey 返回修改后的对象附加而不是 this.createConversationObject() 的结果

  • 介绍 switchMap在此之后,使用 rxjs -> from 将 Promise 转换为 Observable运算符,还转换从先前的 map 返回的更新对象的结果使用 rxjs -> of 操作到一个新的 Observable 中运营商

  • 现在返回 CombineLatest(OriginalObservable, fromPromiseObservable) 的结果

  • 最后,您还需要将这两个 Observable 返回的结果映射到其中一个,直接在调用 this.createConversationObject() 时使用它

  • 最后,您可以订阅结果以获取实际结果作为最后一步

希望这能澄清!

原始回复

这是我的建议:

  • 你可以转换this.af.getUserName(userKey)首先使用 fromPromise promise 一个可观察对象由 rxjs 提供。
  • 然后在您现有的 CombineLatest 中将此转换后的可观察对象用于用户名在SwitchMap block
  • 最后在您的 map 中使用现在将成为转化次数和用户名的结果 block 以获取返回语句的用户名

关于Angular - 将 Observables 与 promise 相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51391600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com