回调可以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
,它将调用on_post_added
添加到您的 Firebase 的每个帖子
- 这将导致对服务器的调用,这可能需要很长时间才能返回
- 同时,您的 JavaScript 代码会继续并...
- 记录数组,在这个阶段它仍然是空的
- 然后因此返回一个空数组
- 现在在某个时候服务器返回新值并调用您的回调
- 这意味着我们可以毫无问题地将它添加到数组中
- 并将其记录到控制台显示预期值
处理这样的异步代码/回调需要一些时间来适应,但对于使用 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
}