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