首页 > 解决方案 > onSnapshot、forEach 和 get() 在 Firebase 上同步

问题描述

我正在使用 firebase.onSnapshot来获取当前在线用户的 ID,并将每个 ID 存储到一个数组中。我成功部署.onSnapshot获取在线用户的ID,但我最后返回一个空数组

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的当前用户的 ID 名为user_uid.

然后 .onSnapshot 在集合中监听另一组用户的在线状态(如果用户在线或离线,它会自动更新)ns_status。之后,.onSnapshot检查返回的在线用户,如果spoken_language他们的文档中的字段(以其相应的 uid 命名)与learning_language之前定义的匹配。如果匹配,则将 uid 存储到ns_match.

里面的值ns_match是正确的。我认为.get()异步执行。这就是为什么ns_match返回空。

我应该如何ns_match在正确存储所有值的情况下最后返回?

提前致谢。

标签: javascriptfirebasegoogle-cloud-firestore

解决方案


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));


推荐阅读