更新:如果您使用 jQuery,我已经了解了一个更好的答案,请参阅标题下的更新:使用 jQuery Defered
旧答案:
您还可以使用Array.reduceRight(如果可用)来包装$.ajax 调用并将类似的列表:[resource1, resource2] 转换为$.ajax({url:resource1,success: function(...) { $ajax({url: resource2...(我从 Haskell 中学到的一个技巧,它是 fold/foldRight函数)。
这是一个例子:
var withResources = function(resources, callback) {
var responses = [];
var chainedAjaxCalls = resources.reduceRight(function(previousValue, currentValue, index, array) {
return function() {
$.ajax({url: currentValue, success: function(data) {
responses.push(data);
previousValue();
}})
}
}, function() { callback.apply(null, responses); });
chainedAjaxCalls();
};
那么你可以使用:
withResources(['/api/resource1', '/api/resource2'], function(response1, response2) {
// called only if the ajax call is successful with resource1 and resource2
});
使用 jQuery 延迟
如果您使用 jQuery,则可以通过使用 jQuery.when() 函数来利用 jQuery Deffered:
jQuery.when($.get('/api/one'), $.get('/api/two'))
.done(function(result1, result2) {
/* one and two is done */
});