Promise.all возвращает неверный снимок из Firebase - PullRequest
1 голос
/ 06 марта 2019

Я создал небольшое приложение для обмена сообщениями для развлечения, и я пытался общаться между пользователями, и я сделал запрос на соединение, потому что я денормализовал свою схему на базе Firebase.

Итак, вот моя схема:

{
  "messages": {
    "-LZtqlYn2WB_1E-u4gUk-LZtqlYn2WB_1E-u4gUo": {
      "-LZv3-yzpZ88lCLkGyRT": {
        "createdAt": 1551474102199,
        "receiverId": "-LZtqlYn2WB_1E-u4gUo",
        "senderId": "-LZtqlYn2WB_1E-u4gUk",
        "text": "alls"
      }
    },
    "-LZtqlYn2WB_1E-u4gUo-L_8ymxVU_bS8r9Rux4y": {
      "-L_8z5l0mNgJodbdh07O": {
        "createdAt": 1551724473404,
        "receiverId": "-LZtqlYn2WB_1E-u4gUo",
        "senderId": "-L_8ymxVU_bS8r9Rux4y",
        "text": "asfasfsf"
      }
    }
  },
  "users": {
    "-LZtqlYn2WB_1E-u4gUo": {
      "conversations": {
        "-L_8ymxVU_bS8r9Rux4y": {
          "conversationId": "-LZtqlYn2WB_1E-u4gUo-L_8ymxVU_bS8r9Rux4y",
          "unseenCount": 5
        }
      },
      "createdAt": 1551453853939,
      "image": "https://d35arkf8909z2a.cloudfront.net/new_user.png",
      "name": "John"
    },
    "-L_8ymxVU_bS8r9Rux4y": {
      "createdAt": 1551724392288,
      "image": "https://d35arkf8909z2a.cloudfront.net/new_user.png",
      "name": "Meryl"
    }
  }
}
  • Сообщения имеют уникальный идентификатор, который представляет собой комбинацию двух пользователей, , как этот , и имеет дочерний объект объектов сообщения..
  • У пользователей есть коллекция разговоров, а ключ разговора - это другой идентификатор пользователя.

Мой запрос на стороне js:

export function fetchConversations(userId) {
  return (dispatch) => {
    dispatch(fetchingConversations());

    const rootRef = firebase.database().ref();
    const conversations = rootRef.child(`users/${userId}/conversations`);

    return conversations
      .once('value', (snap) => {
        const promises = [];

        snap.forEach((data) => {
          const { conversationId } = data.val();

          const userRef = rootRef.child(`users/${data.key}`);
          const messagesRef = rootRef.child(`messages/${conversationId}`).limitToLast(1);

          promises.push(userRef.once('value'));
          promises.push(messagesRef.once('value'));
        });

        return Promise.all(promises);
      })
      .then((results) => {
        // this gives me conversations
        // but I want users and messages
        console.log(results.val());
      });
  };
}

Моя проблема

  • fetchConversations возвращает разговоры вместо пользователей и сообщений.Как я могу вернуть пользователей и сообщения?

1 Ответ

0 голосов
/ 09 марта 2019

Я понял, но не знаю, лучший ли это способ сделать это.Я думаю, что моя проблема была в массиве обещаний, я решил его, как показано ниже:

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));
      });
  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...