角度-将Observables与Promise结合

时间:2018-07-17 23:41:29

标签: 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) 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。但是,我一直在努力等待结果-为了在调用返回之前获取用户名。

有人对我如何正确获得预期结果有任何建议吗?

1 个答案:

答案 0 :(得分:0)

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

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

这是需要对代码进行的修改:

  • map(conversations =>块中,返回添加了userkey而不是this.createConversationObject()

  • 的结果的已修改对象
  • 在此之后引入switchMap并使用rxjs -> from运算符将Promise转换为Observable,还将先前map操作返回的更新对象的结果转换为新的Observable使用rxjs -> of运算符

  • 现在返回CombineLatest(OriginalObservable, fromPromiseObservable)

  • 的结果
  • 最后,您还需要将这两个Observable返回的结果映射为直接在调用this.createConversationObject()

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

希望这可以澄清!

原始回复

这是我的建议:

  • 您可以先使用rxjs提供的this.af.getUserName(userKey)fromPromise的诺言转换为可观察的。
  • 然后在CombineLatest块中现有SwitchMap的用户名中使用此转换后的observable for用户名
  • 最后使用map块中的转换和用户名来获取返回语句的用户名