3

on() を使用して Firebase からデータを取得するこのコードがあります。on() 内で、将来使用するために関数から送信するオブジェクトを作成します-return を使用しますが、何も返されないようです。それで問題は、どうすればそれを正しくできるかということです。

postsRef.on('value', function(snapshot) {
 if (snapshot.val() === null) {
  var allPosts = false,
  numberOfPosts = 0;
 }
 else {
  var allPosts = snapshot.val(),
  numberOfPosts = Object.size(allPosts);
 }
 var postsData = {
  content: allPosts,
  count: numberOfPosts
 };
 return postsData;
});
4

1 に答える 1

6

コールバック関数は非同期で呼び出されます (将来のある時点で)。したがって、呼び出されるまでに、postsRef.on(...)はすでに返されており、その直後のコードはすべて実行されています。

たとえば、これは魅力的かもしれませんが、うまくいきません:

var postsData;
postsRef.on('value', function(snapshot) {
    postsData = snapshot.val();
});
console.log(postsData); // postsData hasn't been set yet!

したがって、これに取り組むにはいくつかの異なる方法があります。最良の答えは、好みとコード構造によって異なります。

アクセスするロジックpostsDataをコールバックに移動

postsRef.on('value', function(snapshot) {
    postsData = snapshot.val();
    console.log(postsData);
});

コールバックが呼び出されたときに別の関数を呼び出す

function logResults(postsData) {
   console.log(postsData);
}

postsRef.on('value', function(snapshot) {
    logResults(snapshot.val());
});

イベントをトリガーする

function Observable() {
   this.listeners = [];
}

Observable.prototype = {
   monitorValue: function( postsRef ) {
      var self = this;
      postsRef.on('value', function(snapshot) {
         self._notifyListeners(postsRef);
      });
   },

   listen:  function( callback ) {
      this.listeners.push(callback);
   },

   _notifyListeners: function(data) {
      this.listeners.forEach(function(cb) {
         cb(data);
      }
   }
};

function logEvent( data ) {
   console.log(data);
}

var observable = new Observable();
observable.listen( logEvent );
observable.monitorValue( /* postsRef goes here */ );
于 2013-09-30T14:55:09.050 に答える