当前位置: 首页 > 面试题库 >

将父范围中的变量传递给回调函数

夹谷弘亮
2023-03-14
问题内容

与Firebase问题相比,这更像是JavaScript关闭问题。在以下代码中,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很好地识别/修改。问题是,当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
}

现在,可能会更容易了解发生了什么。

  1. 您注册一个侦听器child_added,该侦听器将调用on_post_added添加到Firebase中的每个帖子
  2. 这将导致对服务器的调用,这可能需要花费大量时间才能返回
  3. 同时,您的JavaScript代码继续,并且…
  4. 记录数组,该数组在此阶段仍为空
  5. 然后返回一个空数组
  6. 现在,服务器会在某个时候返回新值,并调用您的回调
  7. 这意味着我们可以毫无问题地将其添加到数组中
  8. 并将其记录到控制台会显示预期值

像这样处理异步代码/回调需要一些时间,但是对于使用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
}


 类似资料:
  • 问题内容: 我正在尝试通过jQuery AJAX调用预加载一些图像,但是在将(url)字符串传递到AJAX调用的成功函数内的函数时遇到了实际问题(如果有意义)。 这是我的代码,原样: 可以看到我(失败的)尝试将url传递到调用中- 最终得到了递增整数的值。不确定为什么或与这些东西有什么关系,也许是jpg文件的数量? …无论如何,它当然应该在我原始的urls数组中使用单个值。 感谢您的帮助-我似乎总

  • 问题内容: 很多人说评论中的要求太多,这让我犹豫不决,但是我仍然没有在他们的答案中找到解决方案,主要是因为(1)他们通常使用jQuery,而(2)问题通常包含我不理解的技术。 我有一个函数,里面有一个变量。变量被分配了一个功能。我敢肯定,这个概念不是AJAX独有的,但这是我正在使用的上下文(如果有区别的话)。 我想将变量传递给函数。但是,由于没有原始函数声明,如何指定参数?我能做到吗? 问题答案:

  • 问题内容: 是否可以通过某种方式将一个函数的范围传递给另一个函数? 例如, 我宁愿直接访问变量,即,不使用类似或的任何东西,而只是直接使用或。 问题答案: 真正访问函数私有范围的唯一方法是在函数内部声明,这样就形成了一个闭包,允许隐式访问变量。 这是您的一些选择。 直接访问 在内部声明。 如果您不想在中使用,则可以将它们都放在更大的容器范围内: 这些是您可以直接使用的变量而无需任何额外的代码来移动

  • 问题内容: 尽管在ChildCtrl中实例化了一个“新”变量,我如何进行变量更改并将其轻松传播回ParentCtrl?加分点数最少,甚至没有$ on和$ watch(使其更易于实现) ParentCtrl ChildCtrl / ChildCtrl2 / ChildCtrl3 / ChildCtrl4 视图 我的ChildCtrl的区别就足够大了,我无法轻松抽象出主布局和ng-view,但是它们都

  • 问题内容: 好的,所以我想在动态生成的模板url中使用作用域变量。所以我尝试了这个: html js 我原本希望返回的值,但最终却得到了。结果导致templateUrl为。 那么,我该怎么办才能获取范围变量的值而不是原始文本? 问题答案: 作用域值不能从指令的templateUrl中访问。这些属性尚未编译,因此无法在此上下文中访问范围。 这是一种可能适合您的解决方法。 见Plunkr 我在这里所做

  • 问题内容: 我试图将回调函数从控制器传递给指令。 这是回调函数代码: 指令用法: 指令代码: 模板中的回调用法: 但是,这给了我以下错误: 我看过很多类似的问题,但不明白我在哪里错了。 问题答案: 从指令中调用表达式方法时,您需要以格式传递指令中的参数,还应更正指令属性值以像 指令用法: 指令模板