0

usersフィールドを持つ参照を持つ Firebaseがありますuser_id。( [Firebase]/[app]/users/user_id)

ユーザーを挿入し、user_id を割り当てます。しかし、userRef (への参照) から user_id の値を読み取ると、最初usersは読み取られません。後続の読み取りは完全に正常に機能します。

user_idデバッガーを使用すると、ユーザーの作成時に aが割り当てられていることがわかります。最初の呼び出しで Firebase 参照が更新され、その後の呼び出しで更新された Firebase が表示されるようになったようです (それが何であるかはわかりません。それが表示されるだけです)。

これはの値を読み取るための私のコードですuser_id:

var userID = 0;
userRef.on('value', function(snapshot) {
    userID = snapshot.val().user_id;
});
alert(userID);

初めて、アラートが表示されます0。その後は毎回、正しい値が表示されます。

問題をさらに奇妙にするために、 と同じ方法で作成された をgames参照しています。しかし、私の読み取りは(まったく同じ方法で同時に)毎回機能します。game_idusergame_id

何か案は?

4

2 に答える 2

2

ここでの問題は、(一般に) .on() がコールバック関数をすぐにトリガーしないことです。特に、ある場所で初めて .on() を実行すると、Firebase はサーバーに現在の値を問い合わせ、応答を待ってから、コールバックを呼び出す必要があります。そして、これはすべて非同期で行われます。

現在のコードの書き方は、「alert(userID);」です。コールバック コード ("userID = snapshot.val().user_id;") の前に実行されているため、最初は常に 0 と報告されます。簡単な修正は、alert() をコールバック内に移動することです。

var userID = 0;
userRef.on('value', function(snapshot) {
    userID = snapshot.val().user_id;
    alert(userID);
});
于 2012-07-20T19:11:17.337 に答える
0

jQuery の Promise モデルonceを使用して、2 つのコールバックを待機する一般的な方法を次に示します。

var userID = 0;

// sends a callback to fx where the results can be stored
function defer( fx ) {
   return function() {
      var deferred = $.Deferred();
      fx( function(snapshot) { deferred.resolve(snapshot.val(); } );
      return deferred.promise();
   }
}

$.when( // wait for both actions to complete
   defer( function(callback) { userRef.once('value', callback)   }),
   defer( function(callback) { widgetRef.once('value', callback) })
).then( function(values) {   
   // both deferreds are done now
   // and values contains an array with the snapshot.val() from each call
   console.log(values);
});
于 2012-07-23T14:35:18.250 に答える