2013-09-30 31 views
3

我有这段代码使用on()从Firebase获取数据,on()我创建对象,我想发送函数以供将来使用 - 使用return,但它似乎没有任何回报。 所以问题是我该怎么做才对?Firebase on()不返回任何东西

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; 
}); 

回答

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 */); 
+0

谢谢你的回答,我还是有点困惑。当我在回调中移动逻辑时,会触发很多次 - 在ref的每次更改期间,我都会使用once()。对我来说最好的方式是将数据从返回的对象中取出,也许类似于这里提到的:使用promise()函数http://stackoverflow.com/questions/11636731/handling-asynchronous-calls-firebase-in-functions在jQuery中,但是无论如何都要感谢:) – Johncze

+1

如果你现在只想获得数据值的通知,并且在将来它不会改变,那么once()就是要走的路!在异步世界中不存在“返回对象”这样的事情,因为没有办法知道实际上何时会调用相对于后面代码的回调。如果他们对你更有意义,承诺也是一个很好的选择。 – Kato