在Firebase上同步onSnapshot,forEach和get()

时间:2019-04-01 20:43:43

标签: javascript firebase google-cloud-firestore

我正在使用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);

我要做的是首先定义具有当前用户ID的learning_language的{​​{1}}集合ll_profile

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

的数组中

ns_match.中的值正确。我认为ns_match是异步执行的。这就是.get()返回空的原因。

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

谢谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

包装诺言是正确的举动。但是,请记住快照会返回有关结果的元数据。特别是dfIndex.merge( dfSpa[[0,2]], on=0)[[1,2]].rename(columns={2: "Spa"}).merge( dfEng, left_on=1, right_on=0).rename(columns={2: "Eng"})[['Spa', 'Eng']] 。可以使用该值在snapshot.size方法内对记录进行计数,或者将目标数组的长度与snapshot.size值进行比较