Javascript Promise.all从Firebase返回错误的快照

Javascript Promise.all从Firebase返回错误的快照,javascript,firebase,firebase-realtime-database,promise,Javascript,Firebase,Firebase Realtime Database,Promise,我创建了一个很有趣的小消息应用程序,我试图获取用户之间的对话,我做了一个加入查询,因为我在firebase上对我的模式进行了非规范化 这是我的模式: 消息具有唯一的id,该id是两个用户的组合,并且具有消息对象的子对象 用户拥有会话集合,会话密钥是其他用户id 我在js端的查询: 我的问题 fetchConversations返回的是对话,而不是用户和消息。如何返回用户和消息 我已经想出了办法,但我不知道这是不是最好的办法。我想我的问题是关于promises数组,我已经像下面的代码一样解决

我创建了一个很有趣的小消息应用程序,我试图获取用户之间的对话,我做了一个加入查询,因为我在firebase上对我的模式进行了非规范化

这是我的模式:
  • 消息具有唯一的id,该id是两个用户的组合,并且具有消息对象的子对象
  • 用户拥有会话集合,会话密钥是其他用户id
我在js端的查询: 我的问题
  • fetchConversations返回的是对话,而不是用户和消息。如何返回用户和消息

    • 我已经想出了办法,但我不知道这是不是最好的办法。我想我的问题是关于promises数组,我已经像下面的代码一样解决了它:

      export function fetchConversations(userId) {
        return (dispatch) => {
          dispatch(fetchingConversations());
      
          const users = [];
          const messages = [];
          const rootRef = firebase.database().ref();
      
          return rootRef
            .child('users')
            .child(userId)
            .child('conversations')
            .once('value')
            .then((conversationSnapshots) => {
              const promises = [];
      
              conversationSnapshots.forEach((conversation) => {
                const { conversationId } = conversation.val();
      
                promises.push(
                  rootRef
                    .child('users')
                    .child(conversation.key)
                    .once('value')
                    .then((user) => {
                      const _user = Object.assign({ id: conversation.key }, user.val());
                      users.push(_user);
                    }),
                );
      
                promises.push(
                  rootRef
                    .child('messages')
                    .child(conversationId)
                    .limitToLast(1)
                    .once('value')
                    .then((message) => {
                      const _message = message.val();
                      messages.push(_message[Object.keys(_message)[0]]);
                    }),
                );
              });
      
              return Promise.all(promises);
            })
            .then(() => {
              const data = [];
      
              for (let i = 0; i < users.length; i++) {
                data.push({
                  id: users[i].id,
                  receiver: { name: users[i].name, image: users[i].image },
                  lastMessage: messages[i].text,
                  lastMessageDate: moment(messages[i].createdAt),
                });
              }
      
              dispatch(fetchingConversationsSuccess(data));
            });
        };
      }
      
      导出函数fetchConversations(userId){
      返回(发送)=>{
      分派(获取对话());
      常量用户=[];
      常量消息=[];
      const rootRef=firebase.database().ref();
      返回rootRef
      .child(“用户”)
      .child(用户ID)
      .child(“对话”)
      .once('值')
      .然后((对话快照)=>{
      常量承诺=[];
      conversationSnapshots.forEach((对话)=>{
      const{conversationId}=conversation.val();
      承诺,推动(
      根参考
      .child(“用户”)
      .child(对话.key)
      .once('值')
      。然后((用户)=>{
      const_user=Object.assign({id:conversation.key},user.val());
      用户推送(_user);
      }),
      );
      承诺,推动(
      根参考
      .child(“消息”)
      .child(会话ID)
      .limitToLast(1)
      .once('值')
      。然后((消息)=>{
      const_message=message.val();
      messages.push(_message[Object.keys(_message)[0]]);
      }),
      );
      });
      返回承诺。全部(承诺);
      })
      .然后(()=>{
      常量数据=[];
      for(设i=0;i
      我已经想出了办法,但我不知道这是不是最好的办法。我想我的问题是关于promises数组,我已经像下面的代码一样解决了它:

      export function fetchConversations(userId) {
        return (dispatch) => {
          dispatch(fetchingConversations());
      
          const users = [];
          const messages = [];
          const rootRef = firebase.database().ref();
      
          return rootRef
            .child('users')
            .child(userId)
            .child('conversations')
            .once('value')
            .then((conversationSnapshots) => {
              const promises = [];
      
              conversationSnapshots.forEach((conversation) => {
                const { conversationId } = conversation.val();
      
                promises.push(
                  rootRef
                    .child('users')
                    .child(conversation.key)
                    .once('value')
                    .then((user) => {
                      const _user = Object.assign({ id: conversation.key }, user.val());
                      users.push(_user);
                    }),
                );
      
                promises.push(
                  rootRef
                    .child('messages')
                    .child(conversationId)
                    .limitToLast(1)
                    .once('value')
                    .then((message) => {
                      const _message = message.val();
                      messages.push(_message[Object.keys(_message)[0]]);
                    }),
                );
              });
      
              return Promise.all(promises);
            })
            .then(() => {
              const data = [];
      
              for (let i = 0; i < users.length; i++) {
                data.push({
                  id: users[i].id,
                  receiver: { name: users[i].name, image: users[i].image },
                  lastMessage: messages[i].text,
                  lastMessageDate: moment(messages[i].createdAt),
                });
              }
      
              dispatch(fetchingConversationsSuccess(data));
            });
        };
      }
      
      导出函数fetchConversations(userId){
      返回(发送)=>{
      分派(获取对话());
      常量用户=[];
      常量消息=[];
      const rootRef=firebase.database().ref();
      返回rootRef
      .child(“用户”)
      .child(用户ID)
      .child(“对话”)
      .once('值')
      .然后((对话快照)=>{
      常量承诺=[];
      conversationSnapshots.forEach((对话)=>{
      const{conversationId}=conversation.val();
      承诺,推动(
      根参考
      .child(“用户”)
      .child(对话.key)
      .once('值')
      。然后((用户)=>{
      const_user=Object.assign({id:conversation.key},user.val());
      用户推送(_user);
      }),
      );
      承诺,推动(
      根参考
      .child(“消息”)
      .child(会话ID)
      .limitToLast(1)
      .once('值')
      。然后((消息)=>{
      const_message=message.val();
      messages.push(_message[Object.keys(_message)[0]]);
      }),
      );
      });
      返回承诺。全部(承诺);
      })
      .然后(()=>{
      常量数据=[];
      for(设i=0;i
      是的,添加了
      child\u后,您不能使用承诺。那么我应该使用什么来代替添加的child\u?对不起,我不知道firebase。难道没有什么方法可以让你们所有的孩子都得到满足吗?我想,我可以使用value listener,但我不知道如何通过内部查询返回承诺。是的,添加了
      child\u
      listener,你们就不能使用承诺。那个么我应该用什么来代替添加的child\u呢?对不起,我不知道firebase。难道没有什么方法可以让你们所有的孩子都明白吗?我想,我可以使用value listener,但我不知道如何用内部查询返回承诺。
      export function fetchConversations(userId) {
        return (dispatch) => {
          dispatch(fetchingConversations());
      
          const users = [];
          const messages = [];
          const rootRef = firebase.database().ref();
      
          return rootRef
            .child('users')
            .child(userId)
            .child('conversations')
            .once('value')
            .then((conversationSnapshots) => {
              const promises = [];
      
              conversationSnapshots.forEach((conversation) => {
                const { conversationId } = conversation.val();
      
                promises.push(
                  rootRef
                    .child('users')
                    .child(conversation.key)
                    .once('value')
                    .then((user) => {
                      const _user = Object.assign({ id: conversation.key }, user.val());
                      users.push(_user);
                    }),
                );
      
                promises.push(
                  rootRef
                    .child('messages')
                    .child(conversationId)
                    .limitToLast(1)
                    .once('value')
                    .then((message) => {
                      const _message = message.val();
                      messages.push(_message[Object.keys(_message)[0]]);
                    }),
                );
              });
      
              return Promise.all(promises);
            })
            .then(() => {
              const data = [];
      
              for (let i = 0; i < users.length; i++) {
                data.push({
                  id: users[i].id,
                  receiver: { name: users[i].name, image: users[i].image },
                  lastMessage: messages[i].text,
                  lastMessageDate: moment(messages[i].createdAt),
                });
              }
      
              dispatch(fetchingConversationsSuccess(data));
            });
        };
      }