Javascript 等待所有函数和请求完成

Javascript 等待所有函数和请求完成,javascript,jquery,Javascript,Jquery,现在我已经有了一些代码,它接收了我希望加载的模块的字符串数组 script.js moduleLoader.load([ 'mainModule', 'aboutUsModule', 'featuresModule', 'messageModule' ]); moduleLoader.load函数对数组中的每个循环执行一个$。然后继续获取每个模块所需的信息 模块阅读器 var load = function (modules) { $.each(modu

现在我已经有了一些代码,它接收了我希望加载的模块的字符串数组

script.js

moduleLoader.load([
    'mainModule',
    'aboutUsModule',
    'featuresModule',
    'messageModule'
]);
moduleLoader.load
函数对数组中的每个循环执行一个
$。然后继续获取每个模块所需的信息

模块阅读器

var load = function (modules) {
    $.each(modules, function (index, module) {
        getConfig(module);
    });
};
getConfig

var getConfig = function (module) {
    $.get(module + '/config.json').done(function (config) {
        console.log(config);
        getData(config);
    }).fail(function () {
        console.error('Couldn\'t find a config file for module: ' + module);
        return 0;
    });
};
然后,您可以在
getConfig
回调中看到,它继续获取数据,这也是异步的,之后还有两个步骤是异步的

所以它基本上是内部回调内部回调。。。等等

只是我把它分成了几个函数,这样看起来就更好了


现在,我可以获得所有信息,但每次加载的方式都不同,因此是否可以知道何时完成所有ajax请求,然后再执行一些操作?

您可以使用jQuery函数
$。when()
这正是您需要的:

要使代码正常工作,您可以进行一些重构:

var XHRs = [];

var load = function (modules) {
  $.each(modules, function (index, module) {
    XHRs.push(getConfig(module));
  });
};

$.when(XHRs).then(function() {
  // do something
});
而且您的
getConfig()
函数应该返回
$.get
。这是因为jQuery中的$.ajax创建了一个延迟对象,它实际上允许您链接函数或让它们彼此等待

供日后参考:

您可以利用承诺链将它们组合在一起,并在它们全部完成时做一些事情(类似于这样):


如果没有其他挂起的ajax请求,则使用相关的全局ajax事件:


然后您有一个全局
XHRs
变量?如果至少有一个请求失败怎么办?我想这会引起更多的问题,但只要说……。@A.Wolff可能是进入
$的第二个fn。当
我看到OP被要求
时,所有ajax请求都完成了
,所以事实上你的答案会像预期的那样有效。我更想知道如何使用
always()
isntead of
then(successHandler)
,但就像我刚才说的,忘记我的第一条评论;)但是当您停止使用jquery时,它就完全崩溃了;-)
var load = function (modules) {
    var promises = modules.map(getConfig);

    // can use $.when or Promise.all here
    $.when.apply($, promises).then(function () {
         // do something when all done
    });
};

var getConfig = function (module) {
    // $.get returns a jqXHR which is "thennable"
    return $.get(module + '/config.json').then(function (config) {
        console.log(config);
        // if this also returns a promise then it will
        // wait till this one is done as well in the promise chain
        return getData(config); 
    }, function () {
        console.error('Couldn\'t find a config file for module: ' + module);
        return 0;
    });
};
$( document ).one('ajaxStop', function() {
  // all ajax requests has finished
});