【问题标题】:onSnapshot, forEach, and get() synchronously on FirebaseonSnapshot、forEach 和 get() 在 Firebase 上同步
【发布时间】:2019-04-01 20:43:43
【问题描述】:

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

我要做的是首先定义从集合ll_profile中检索到的learning_language,当前用户的ID名为user_uid.

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

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

我应该如何在最后返回 ns_match 并正确存储所有值?

提前致谢。

【问题讨论】:

  • 您可以使用承诺或回调。无需将此调用异步\

标签: javascript firebase google-cloud-firestore


【解决方案1】:
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));

【讨论】:

  • 嗨 Tanmay,尝试了您提供的内容,它仍然将解析返回为空数组,然后将值存储在里面。
【解决方案2】:

包装承诺是正确的举动。但是,请记住,快照会返回有关结果的元数据。特别是snapshot.size。可以在 foreach 方法中使用该值来计算记录,或者将目标数组长度与 snapshot.size 值进行比较

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 2021-12-12
    • 2021-01-29
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 2018-09-18
    • 2018-09-27
    相关资源
    最近更新 更多