コールバック関数は非同期で呼び出されます (将来のある時点で)。したがって、呼び出されるまでに、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 */ );