gpt4 book ai didi

javascript - 尝试解决javascript中异步代码引起的问题

转载 作者:行者123 更新时间:2023-12-03 01:47:42 25 4
gpt4 key购买 nike

我是数据库系统的新手,我想做的是检查用户在登录时输入的电子邮件是否存在于数据库中。我使用 Firebase 数据库。所以,我写的代码是这样的:

function login(){
var e_mail = document.getElementById("e-mail").value;
rootRef = firebase.database().ref();
rootRef.orderByChild("E_mail").on("child_added", function(snapshot){
lst.push(snapshot.val().E_mail);
//console.log(lst);
})
console.log(lst);
}

let lst = [];
login_btn.onclick = function() {login()};

我想从数据库中获取所有电子邮件,将它们添加到列表中,然后循环访问该列表。也许这不是最好的方法,但这就是我正在努力的。我也可以只是说 if (snapshot.val().E_mail == e_mail){alert("there is such a user");} 但我遇到并想要处理的问题是不是那个,它是登录函数中的“回调”函数。当我控制台外部函数中的列表时,它显示一个空列表,因为它在完成外部函数之前不会运行内部函数。我明白这一点。但我怎样才能避免或解决这个问题。我想获得电子邮件的完整列表,以便能够循环浏览它。另外,我不知道如何结束 Firebase 中的“循环”,因为它在收到电子邮件时有点循环。因此,当它找到匹配的电子邮件时,我想立即停止。

最佳答案

您正在下载所有用户以查看某个名称是否已存在。这浪费了带宽。

相反,您应该使用查询来匹配您要查找的电子邮件,并且仅读取该节点:

rootRef.orderByChild("E_mail").equalTo(e_mail).once("value", function(snapshot){
if (snapshot.exists()) {
// A node with the requested email already exists
}
})
<小时/>

一般来说,如果您需要处理所有节点,则需要使用 value 事件,该事件会同时针对所有匹配节点执行。因此,要从数据库中获取所有用户,请将它们添加到列表中,然后对该列表执行某些操作:

rootRef.orderByChild("E_mail").once("value", function(snapshot){
var list = [];
snapshot.forEach(function(childSnapshot) {
list.push(childSnapshot.val());
});
console.log(list); // this will display the populated array
})

请注意,您将无法在回调之外访问列表。即使您在回调外部声明变量,它也只会在回调内部正确填充。请参阅 Xufox 的评论,获取解释原因的链接。

关于javascript - 尝试解决javascript中异步代码引起的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50558265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com