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