2017-07-16 76 views
0

我正在创建一个聊天应用程序,允许用户创建聊天室以讨论特定主题。我遇到的一个问题是,当用户创建具有相同名称的房间时,数据将被覆盖。Firebase Javascript:回拨函数不返回任何内容

我试着通过每个房间,并检查输入的房间是否与用户创建的房间名称相匹配。问题在于,我只能异步获取数据。我试图实现一个回调函数来更新变量,但这似乎不起作用,因为我的警报命令不起作用。

使用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 

回答

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()) 
    } 
    }); 
} 
+0

非常感谢!这工作完美。 – Vaporeon