回调函数被异步调用(将来有一段时间)。所以在它被调用的时候,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()。对我来说最好的方式是将数据从返回的对象中取出,也许类似于这里提到的:使用promise()函数http://stackoverflow.com/questions/11636731/handling-asynchronous-calls-firebase-in-functions在jQuery中,但是无论如何都要感谢:) – Johncze
如果你现在只想获得数据值的通知,并且在将来它不会改变,那么once()就是要走的路!在异步世界中不存在“返回对象”这样的事情,因为没有办法知道实际上何时会调用相对于后面代码的回调。如果他们对你更有意义,承诺也是一个很好的选择。 – Kato