我正在创建一个聊天应用程序,允许用户创建房间来讨论特定主题。我遇到的一个问题是,当用户创建具有相同名称的房间时,数据会被覆盖。
我尝试遍历每个单独的房间,并检查输入的房间是否与用户创建的房间名称匹配。问题是我只能异步获取数据。我尝试实现回调函数来更新变量,但这似乎不起作用,因为我的警报命令不起作用。
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
最佳答案
您的代码中有一些小错误。这应该效果更好:
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
实现从未声明或使用该回调。我添加了一个参数回调,然后在找到房间时调用它。 - 将 bool 值
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())
}
});
}
关于javascript - Firebase JavaScript : Callback function does not return anything,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45131638/