[英]Passing variable in parent scope to callback function
這更像是一個JavaScript Closure問題而不是Firebase問題。 在以下代碼中,Firebase回調未識別父作用域中的變量myArr。
function show_fb() {
var myArr = [];
var firebase = new Firebase('https://scorching-fire-6816.firebaseio.com/');
firebase.on('child_added', function(snapshot) {
var newPost = snapshot.val();
myArr.push(newPost.user);
console.log(myArr); // works
});
console.log(myArr); // doesn't work. myArr in the firebase.on callback is
// not altering myArr
return myArr;
};
回調是完全myArr
地識別/修改myArr
。 問題是當你的“不工作”標記的console.log(myArr)
執行時,回調還沒有被觸發。
讓我們稍微改變你的代碼:
var myArr = [];
function show_fb() {
var firebase = new Firebase('https://scorching-fire-6816.firebaseio.com/');
firebase.on('child_added', on_post_added); // steps 1-3
console.log(myArr); // step 4
return myArr; // step 5
};
function on_post_added(snapshot) { // step 6
var newPost = snapshot.val();
myArr.push(newPost.user); // step 7
console.log(myArr); // step 8
}
現在可能更容易看到發生了什么。
child_added
注冊了一個監聽child_added
,該監聽器child_added
添加到您的Firebase的每個帖子調用on_post_added
像這樣處理異步代碼/回調需要一些人習慣,但對於使用Firebase或任何其他類似AJAX或事件驅動的技術至關重要。 將回調代碼放入一個單獨的函數有時可以更容易地看到正在發生的事情。
對於Firebase,它也可能有助於意識到事件被稱為child_added
有一個原因。 只要孩子被添加到Firebase,就會調用它,而不僅僅是在您第一次注冊回調時。 所以幾分鍾后,當其他一些客戶端添加一個孩子時,你的回調仍然會觸發,向myArr
添加一個新的孩子。 在那個階段,上面的步驟4和5中的代碼將長期執行,並且不會再次執行。
解決方案很簡單:在將子項添加到回調中之后放置您想要執行的任何操作:
var myArr = [];
function show_fb() {
var firebase = new Firebase('https://scorching-fire-6816.firebaseio.com/');
firebase.on('child_added', on_post_added);
};
function on_post_added(snapshot) {
var newPost = snapshot.val();
myArr.push(newPost.user);
console.log(myArr);
// do whatever else you need to do for a new post
}
child_added事件不會立即執行,因此不是同步的,並且在函數結束時的日志調用之前,您不能依賴它來執行。
程序是:
如果Firebase進行ajax調用(可能確實如此),則在return語句之后調用回調函數(快照){..}。 所以函數show_fb總是返回[]。
例如:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.