【问题标题】:Can I declare a non-global variable to store asynchronous values?我可以声明一个非全局变量来存储异步值吗?
【发布时间】:2014-08-09 02:12:09
【问题描述】:

我有多个 JavaScript 文件。 我有一个在加载时运行的 JS 函数,其中包含多个 AJAX 调用。 每个 AJAX 调用都会执行一个回调(以及增加一个同步计数器):: myArray.push('somevalue');

这样我就可以验证所有 AJAX 调用(针对此 JS 文件)何时完成。

有没有一种方法可以避免将 myArray 声明为全局变量,同时允许异步回调推送到该数组中?

【问题讨论】:

  • 您必须将myArray 传递给每个呼叫。
  • 如果您将 myArray 传递给每个调用,它仍然会引用该变量吗?既然JS是传值的,那么异步调用就不会去搜索[reference of]原始变量了?
  • 只需创建一个非全局范围,jQuery document.ready 或 IIFE 即可,并将数组设置在与 ajax 调用相同或更高的范围内。
  • 如果你传递一个数组,那么就是一个对数组的引用
  • 您在 cmets here 中有 2 个很好的解决方案,但我的问题是,您为什么担心使这个数组成为全局数组?

标签: javascript jquery ajax scope


【解决方案1】:

如果您想在完成一定数量的 AJAX 请求后执行某些代码,请使用$.when

如果您仅使用myArray 来了解请求何时完成,则可以将其删除。如果您使用它来存储每个请求的结果,则可以将其保持在与请求相同的范围内,然后在 done 处理程序中访问它。试试这个:

var myArray = [];

var ajax1 = $.ajax({
    url: '/foo/',
    success: function(data) {
        myArray.push(data);
    });
});

var ajax2 = $.ajax({
    url: '/bar/',
    success: function(data) {
        myArray.push(data);
    });
});

$.when(ajax1, ajax2).done(function() {
    // both requests complete
    // myArray will contain the data of both requests at this point...
    for (var i = 0; i < myArray.length; i++) {
        console.log(myArray[i]);
    }
});

【讨论】:

  • 我不是反对者,但我认为这是因为你没有解决 OP 询问的情况,如果他可以有一个不是 global 的数组,并让每个回调分配给它.
  • 这确实解决了这个问题 - 如果数组的唯一目的是知道请求何时完成,则不再需要数组。如果它用于存储每个请求的结果,它可以与请求本身在同一范围内(即不是全局的),然后在done处理程序中访问。
  • 我会解释这一点,并为更好的解决方案投票,几个月前我才知道 .when() 并用它清理了很多代码
  • @ScottSelby 是的,这是在 AJAX 繁重的网站中统治的一种非常方便的方法。感谢您的建议。
  • 很遗憾,我的 jQuery 版本有点落后,但我目前正在考虑升级。
【解决方案2】:

声明一个只能在你想要的范围内访问的变量(例如,在函数内部)。

类似:

var ajaxCalls = function() {
    var myArray = [];

    var ajax1 = $.ajax({
        url: 'foo.com',
        success: function(data) {
            myArray.push(data);
        });
    });

    // do more AJAX stuff

    $.when(ajax1, ..., ).done(function() {
        // make sure all requests are complete
        // do stuff with the completed array
    });
};

由于 JavaScript 具有功能范围,您的 myArray 变量不会是全局变量,但可以在 ajax 回调中访问。希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 2010-10-01
    • 2012-06-18
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多