2017-08-08 3 views
0

このサイトの私のrecent question(私が "Promise"技術に頼る前)から、変数をファイアベースデータベースに保存するのではなく、私はそれを(たとえ非同期のものであっても)すべての関数で使うことができるように、javascriptのグローバル変数です。それがログインしているユーザーのための対応するキー保存されたので、Firebaseのデータが内容を持っていてもUNDEFINEDの値を返す

function logIn(){ 
 
\t var loggedUname = $("#loginUname").val(); 
 
\t var loggedPword = $("#loginPword").val(); 
 
\t 
 
\t var tailorRef = firebase.database().ref('tailors'); 
 
\t var keyRef = firebase.database().ref(); 
 
\t 
 
\t tailorRef.on('value', function(data){ 
 
\t \t data.forEach(function(childData){ 
 
\t \t \t if ((loggedUname == childData.val().tUsername) && (loggedPword == childData.val().tPassword)){ 
 
\t \t \t \t currentKey = childData.key; 
 
\t \t \t } 
 
\t \t }); 
 
\t \t keyRef.update({currentTailor: currentKey}); 
 
\t \t alert("key = " + keyRef.currentTailor); 
 
\t }); 
 
\t 
 
}

.update方法が成功した:だから私はこのコードを作っ

the updated database

を私がしようとすると、アラートを使用して検索するには、「未定義」と表示されます。データベースのルート参照から呼び出していると仮定しているため、理解できません。

私はkeyRefに対して別々の.on()関数を作ってみましたが、それでも同じ結果です。

keyRef.on('value', function(data){ 
 
    alert(data.currentTailor); 
 
});

私は間違った方法でデータを呼ばれていましたか?

+0

Firebaseについてはわかりませんが、 'keyRef.update()'は非同期です。 – Barmar

+0

https://firebase.googleblog.com/2016/01/keeping-our-promises-and-callbacks_76.html .then(function(){alert()})の方法を試してください – Ayudh

+0

@Barmar私は.update ()を私のsignUp関数に追加し、このlogin()関数に格納されていたデータを正常に取得しました。もしあなたが言ったことであれば、私はこの関数のtUsernameとtPasswordを取得できないはずです。 – Kaddy03

答えて

0

正しい方法は次のようになります。それはあなたのページをフリーズするよう

JavaScriptで
keyRef.on('value', function(data){ 
// alert(data.val().currentTailor); see the difference 
    console.log('currentTailor ==>', data.val().currentTailor); 
}); 

alert()はお勧めしません。代わりにコンソールを使用してください。この方法は、あなたのブラウザのコンソール(クロムプレスではCtrl +Shiftキー + J

Firebaseの方法returns the callback function()の中で、あなたのログを見ることができます。データオブジェクトを取得するには、戻り値にval()メソッドを使用する必要があります。次に、対応するキーを使用して任意の値を取得できます。

keyRef.on('value', function(data){ 
// here data is callback function 
}); 

keyRef.on('value', function(data){ 
//data.val() returns the data in object form 
}); 
keyRef.on('value', function(data){ 
// data.val().currentTailor to access currentTailor attribute 
}); 

あなたは戻り値であるかを確認するためにそれらのそれぞれを慰めることができます。

+0

ああ、それはうまくいった!私はいつもあなたがルートに単一の値を持っていると、.val()は必要なく、値の名前で直接呼び出すことができると思っていました。私は間違っていた。ありがとうございました。 – Kaddy03

関連する問題