Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度-结合观测值和承诺_Angular_Firebase Realtime Database_Promise_Observable_Angularfire2 - Fatal编程技术网

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
    this.af.getUserName(userKey)
    promise转换为可观察的
  • 然后在
    SwitchMap
    块中现有的
    combinelatetest
    中使用此转换后的可观察用户名
  • 最后,在
    map
    块中使用转换和用户名的结果来获取return语句的用户名

然而,
userKey
局部变量是在
map(conversations=>
块中定义的。因此,基本上,我不能在它之前使用它。你对我如何处理它有什么建议吗?只是想更清楚地理解它:在你的
映射中(conversations=>
块,使用
开关->case
获取
userkey
,并使用此承诺代码从
createConversationObject(..)中的
userkey
获取用户)
method?正确!获取
userKey
后,我想在promise中使用它,以便对数据库进行新调用并检索用户名。检索名称后,我想将其传递给
createConversationObject(…)
.cool。所以本质上,您不应该在
映射中调用
createConversationObject
(conversations=>
块,因为您的
createConversationObject
将是链中的最后一步;您应该在末尾执行此操作。但首先,您应该使用
用户密钥返回映射数据。在现有块之后引入另一个
映射
块,并添加转换为可观察返回的promise块。您可能需要在链中的这之后添加一个
过滤器
,以便仅当承诺返回
用户名
时才能调用
createConversationObject
。没有问题,请给我一些时间,我可能会根据我们之前的讨论编辑我的上述答案。is
this.af.getObservableSortByVar()
是否也返回一个
可观察的