【问题标题】:Firebase on() does not return anythingFirebase on() 不返回任何内容
【发布时间】:2013-09-30 10:57:51
【问题描述】:

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

【问题讨论】:

    标签: firebase


    【解决方案1】:

    回调函数被异步调用(在未来的某个时间)。因此,当它被调用时,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()。对我来说最好的方法是在返回对象时从中获取数据,也许这里提到了类似的东西:stackoverflow.com/questions/11636731/… with using promise() function in jQuery,但还是谢谢你:)
    • 如果您只想现在就收到数据值的通知,而以后再也不会发生变化,那么 once() 就是要走的路!在异步世界中没有“返回对象”这样的东西,因为没有办法知道相对于它后面的代码何时实际调用回调。如果 Promise 对您更有意义,Promise 也是一个不错的选择。
    猜你喜欢
    • 2018-07-09
    • 2017-04-26
    • 2021-04-24
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多