onSnapshot, forEach и get () синхронно в Firebase - PullRequest
0 голосов
/ 01 апреля 2019

Я использую Firebase's .onSnapshot, чтобы получить идентификатор пользователя, который в данный момент находится в сети, и сохранить каждый идентификатор в массиве. Я успешно развернул .onSnapshot для получения идентификатора онлайн-пользователей, но в конце возвращаю пустой массив

var learning_language;
db.collection(ll_profile).doc(user_uid).get().then(function(doc) {
  learning_language = doc.data().learning_language;
})

db.collection(ns_status).where("state", "==", "online").onSnapshot(function(snapshot) {
  var ns_match = [ ];
  snapshot.forEach(function(userSnapshot) {
    db.collection("ns_profile").doc(userSnapshot.id).get().then(function(doc) {
      spoken_language = doc.data().spoken_language;
      if (learning_language == spoken_language) {
        ns_match.push(userSnapshot.id);
        console.log(ns_match);
      }
    })
  })
  return (ns_match);

Я пытаюсь сначала определить learning_language, извлеченный из коллекции ll_profile, с идентификатором текущего пользователя с именем user_uid.

Затем .onSnapshot прослушивает состояние другой группы пользователей в сети (которое автоматически обновляется, если пользователь в сети или оффлайн) внутри коллекции ns_status. После этого возвращаемый пользователь из .onSnapshot проверяется, совпадает ли поле spoken_language внутри их документа (названное с соответствующим идентификатором uid) с learning_language, определенным ранее. Если он совпадает, сохраните uid в массиве ns_match.

Значения внутри ns_match верны. Я думаю .get() выполняется асинхронно. Вот почему ns_match возвращается пустым.

Как мне вернуть ns_match в конце со всеми значениями, сохраненными правильно?

Заранее спасибо.

1 Ответ

0 голосов
/ 01 апреля 2019
function getMatches() {
  return new Promise(resolve => {
    db.collection(ll_profile).doc(user_uid).get()
      .then(function(doc) {
        var learning_language = doc.data().learning_language;
        db.collection(ns_status)
          .where("state", "==", "online")
          .onSnapshot(function(snapshot) {
            var ns_match = [];
            snapshot.forEach(function(userSnapshot) {
              db.collection("ns_profile")
                .doc(userSnapshot.id)
                .get()
                .then(function(doc) {
                  spoken_language = doc.data().spoken_language;
                  if (learning_language == spoken_language) {
                    ns_match.push(userSnapshot.id);
                    console.log(ns_match);
                  }
                });
            });
            resolve(ns_match);
          });
      });
  });
}


getMatches().then(ns_matches => console.log(ns_matches));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...