javascript - 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
在正确存储所有值的情况下最后返回?
提前致谢。
解决方案
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));
推荐阅读
- python - 用于 SQLAlchemy 连接结果的 Marshmallow 连接模式
- javascript - 如何在 vuejs 中设置 cookie?
- git - 将 Git 存储库从 ISO-8859-1 切换为 UTF-8 编码的源代码文件
- python - 在python类中实现归并排序功能,报错
- firefox - Firefox 问题:遇到此异常 { 消息:“”,结果:3253927937,名称:“NS_ERROR_NOT_INITIALIZED”..}
- python - Pycharm Python3 Flask 模块未找到错误
- javascript - 使用时间戳从多维数组中删除过期对象
- selenium - 与数据提供者并行执行
- algorithm - 如何通过贪心算法解决0/1背包,只关注收益?
- elasticsearch - 无法远程连接到弹性搜索