Firebase on()不会返回任何内容

时间:2013-09-30 10:57:52

标签: firebase

我有这段代码使用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;
});

1 个答案:

答案 0 :(得分: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 */ );