*更新 - 没有像我预期的那样工作(见下面的真正解决方案)
失败的方法
我找到了一条出路eval
……它没有经过全面测试,但看起来还可以。请随时发表您的评论/权衡。
callAjax
是一个接收 url 并返回 promise 的方法return $.ajax(...)
,但是由于我应该使用.when
语句执行它,所以我将所有调用放在一个字符串中,以便稍后在.when
语句中评估它们。
convertAjaxCallsToString = function () {
var result = '';
for (var i = 0; i < ajaxservices.length; i++) {
result += "callAjax(ajaxservices[" + i + "])";
if (i + 1 < ajaxservices.length) {
result += ",";
}
}
return result;
}
由于我预计不会有超过 10 个 ajax 调用,因此我对这 10 个响应(arg 0 - 9)进行了硬编码,如下所示……如果我只使用 3 个 ajax 服务,那么只有 3 个 arg 应该有价值,其他的将是undefined
永远不会是 eval 因为callbacks.length
也应该是 3。
var ajaxcalls = _self.convertAjaxCallsToString();
$.when(eval(ajaxcalls)).done(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) {
for (var i = 0; i < callbacks.length; i++) {
//If you expect a page response, Each argument is an array with the following structure: [ data, statusText, jqXHR ]
var data = eval('arg' + i)[0];
callbacks[i](data);
}
});
可能的解决方案
调用 ajax 没有像我预期的那样工作,所以我决定使用另一种方法。经过测试,工作正常!
$.when(ajax(0), ajax(1), ajax(2), ajax(3), ajax(4), ajax(5), ajax(6), ajax(7), ajax(8), ajax(9))
.done(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) {
for (var i = 0; i < callbacks.length; i++) {
//If you expect a page response, Each argument is an array with the following structure: [ data, statusText, jqXHR ]
var data = eval('arg' + i)[0];
callbacks[i](data);
}
});
如果没有要调用的 ajax 服务,ajax 所在的位置将返回 0。
var ajax = function (index) {
if (index < ajaxservices.length) {
return callAjax(ajaxservices[index]);
}
return 0;
}