【问题标题】:If else not working inside of Firebase snapshot如果在 Firebase 快照中无法正常工作
【发布时间】: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


【解决方案1】:

根据问题的 cmets 线程将其发布为社区 Wiki 答案。随时更新和更改它以提供更多详细信息。

@Craig 告知,解决方案是遵循第一次编辑的想法。通过使用一对 asyncawait 耦合,可以将快照包装在异步函数中,然后 await Firebase 查询。返回数据后,可以检查是否找到布尔值,以确认是否找到匹配项。

【讨论】:

    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2021-07-19
    • 1970-01-01
    相关资源
    最近更新 更多