【发布时间】:2020-08-11 15:22:53
【问题描述】:
我编写了以下代码来检查房间内是否有两个用户:
useEffect(() => {
var chatroom = db.collection('test').where("Users", "array-contains", `${selectedUser}`);
chatroom.get().then(snapshot => {
snapshot.forEach(doc => {
if (doc.data().Users.includes(username) && doc.data().Users.includes(selectedUser)) {
console.log("Found match");
...etc...
setMessages(objects);
}
else {
console.log("Didn't find a valid chat");
setMessages([]);
}
console.log("???");
})
});
}, [username, selectedUser]);
当 if 条件成功时它可以正常工作,但是如果条件为 false 则 else 将不会执行,甚至 console.log("???") 也永远不会运行。我不确定是什么原因造成的。
编辑:我通过添加一个布尔值来表示是否找到匹配项找到了解决方法。快照之外的代码仍在运行,所以我只是将东西移到那里。
Edit2:实际上这不起作用,因为我忘记了 javascript 只会在检索数据之前运行底部的代码。
【问题讨论】:
-
也许,如果您尝试而不是 'else',请编写另一个 if 语句。 if( !doc.data().Users.includes(username) && !doc.data().Users.includes(selectedUser) ) { //你的代码 }
-
@L.Papadopoulos 试过了,不幸的是它没有用。是否可以等待整个快照,然后我在 chatroom.get() 之后的代码在完成之前不会执行?
-
它会抛出任何错误吗?
-
@L.Papadopoulos 没有任何错误。似乎无法弄清楚这里到底发生了什么。
-
@L.Papadopoulos 好的,所以我设法使用编辑#1 中提到的想法加上 async/await 来解决问题,我只是将它包装在一个异步函数中,然后等待 firebase 查询。然后我检查一个找到的布尔值,看看我是否得到它。
标签: javascript firebase google-cloud-firestore