2017-07-16 11 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

あなたのコードにはかなりいくつかの小さなミスがあります。

  • あなたはduplicate(roomName, function(found) {にコールバックを渡す...しかしduplicateの実装は決して宣言していないか、またはコールバックすることを使用しています:

    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. 
    }); 
    

    変更:これは、より良い動作するはずです。コールバックのパラメータを追加して、その部屋が見つかったときに呼び出すようにしました。

  • ブール値foundと、テキスト要素から得た文字列roomnameとを比較します。その比較は決して真実ではありません。データベースからの値をroomnameと比較する可能性が高くなります。私のコードはそれを行いますが、あなたのデータ構造にはsnapshot.keyが正しいかどうかはわかりません。

しかし、このコードはまだ無駄です。特定の部屋があるかどうかをすべての部屋で確認する必要はありません。あなたはただそれをチェックする必要があります。これは、1つの場所だけを簡単に読み取って行うことができます。

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

関連する問題