Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase on()不返回任何内容_Firebase - Fatal编程技术网

Firebase on()不返回任何内容

Firebase on()不返回任何内容,firebase,Firebase,我有一段代码,使用on()从Firebase获取数据,在on()中我创建了一个对象,我想把它发送到函数外供将来使用——使用return,但它似乎什么都不返回。 所以问题是我怎样才能使它正确 postsRef.on('value', function(snapshot) { if (snapshot.val() === null) { var allPosts = false, numberOfPosts = 0; } else { var allPosts = snapshot

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

回调函数是异步调用的(将来某个时候)。因此,在调用它时,
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 */ );

谢谢你的回答,我还是有点困惑。当我在回调中移动逻辑时,它会被触发很多次——在每次更改ref期间,所以我现在使用once()。对我来说,最好的方法是在返回对象时从中获取数据,也许这里提到过这样的事情:在jQuery中使用promise()函数,但无论如何还是要感谢:)如果您现在只想得到数据值的通知,将来数据值更改时再也不想收到通知,那么once()就是最好的选择!在异步世界中不存在“返回对象”这样的东西,因为无法知道相对于后面的代码,回调何时实际被调用。承诺也是一个很好的选择,如果它们对你更有意义的话。