我正在寻找一种在两个 ajax 调用完成后进行回调的方法:
$.when(
call1(),
call2()
).always(function() {
// Here I want to be sure the two calls are done and to get their responses
);
问题是其中一个调用可能会失败。因此,在我的代码中,always 将被调用,而无需等待其他调用。
我如何等待两个调用完成(成功或失败)?
这是应该可以解决问题的东西:
$.whenAllDone = function() {
var deferreds = [];
var result = $.Deferred();
$.each(arguments, function(i, current) {
var currentDeferred = $.Deferred();
current.then(function() {
currentDeferred.resolve(false, arguments);
}, function() {
currentDeferred.resolve(true, arguments);
});
deferreds.push(currentDeferred);
});
$.when.apply($, deferreds).then(function() {
var failures = [];
var successes = [];
$.each(arguments, function(i, args) {
// If we resolved with `true` as the first parameter
// we have a failure, a success otherwise
var target = args[0] ? failures : successes;
var data = args[1];
// Push either all arguments or the only one
target.push(data.length === 1 ? data[0] : args);
});
if(failures.length) {
return result.reject.apply(result, failures);
}
return result.resolve.apply(result, successes);
});
return result;
}
查看这个小提琴 http://jsfiddle.net/HDnsv/1看看它是如何工作的。
基本上,它会等待所有 Deferreds 完成,无论它们是否失败,并收集所有结果。如果失败,返回的 Deferred 将失败并显示所有失败的列表,否则将解决所有成功。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)