我正在使用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
?
谢谢。
答案 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值进行比较