我正在创建一个聊天应用程序,允许用户创建讨论特定主题的房间。我遇到的一个问题是,当用户创建具有相同名称的房间时,数据会被覆盖。
我尝试浏览每个单独的房间,并检查输入的房间是否与用户创建的房间名称相匹配。这个问题是我只能异步获取数据。我试图实现一个回调函数来更新变量,但这似乎不起作用,因为我的警报命令不起作用。
Javascript / JQuery :
var roomName = $.trim(document.getElementById("roomname").value.toLowerCase());
var duplicate = function(roomname) {
var found = false;
roomsRef.on("child_added", function(snapshot) {
if (found == roomname) {
found = true;
}
});
}
duplicate(roomName, function(found) {
alert(found); // State whether it's a duplicate room or not.
});
数据库结构:
rooms
-all
-algorithms
-boxing
-javascript
-money
答案 0 :(得分:2)
您的代码中存在一些小错误。这应该更好:
var roomName = $.trim(document.getElementById("roomname").value.toLowerCase());
var duplicate = function(roomname, callback) {
var found = false;
roomsRef.on("child_added", function(snapshot) {
if (snapshot.key == roomname) {
found = true;
callback(snapshot.val())
}
});
}
duplicate(roomName, function(found) {
alert(found); // State whether it's a duplicate room or not.
});
变化:
duplicate(roomName, function(found) {
...但您的duplicate
实现从未声明或使用该回调。我为回调添加了一个参数,然后在找到房间时调用它。found
与从文本元素中获得的字符串roomname
进行比较。这种比较永远不会成真。您更有可能希望将数据库中的值与roomname
进行比较。我的代码就是这样做的,虽然我不确定snapshot.key
是否适合您的数据结构。但是这段代码仍然很浪费。您不需要倾听所有房间以了解是否存在特定房间。你只需要检查一下。这可以通过简单读取一个位置来完成:
var duplicate = function(roomname, callback) {
var found = false;
roomsRef.child(roomname).once("value", function(snapshot) {
if (snapshot.exists()) {
found = true;
callback(snapshot.val())
}
});
}