Firebase Javascript:回调函数不返回任何内容

时间:2017-07-16 17:45:07

标签: javascript jquery firebase firebase-realtime-database

我正在创建一个聊天应用程序,允许用户创建讨论特定主题的房间。我遇到的一个问题是,当用户创建具有相同名称的房间时,数据会被覆盖。

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

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

1 个答案:

答案 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())
    }
  });
}