Javascript 使用延迟和何时
我在循环中进行ajax调用,ajax调用在self.fileUpload类中:Javascript 使用延迟和何时,javascript,jquery,ajax,Javascript,Jquery,Ajax,我在循环中进行ajax调用,ajax调用在self.fileUpload类中: $.when.apply($, $.map($('.file-new'), function(fileNewTemplate, i) { var formData = new FormData(); return self.fileUpload.upload(formData).then(function(data){ return $.Deferred()
$.when.apply($, $.map($('.file-new'), function(fileNewTemplate, i) {
var formData = new FormData();
return self.fileUpload.upload(formData).then(function(data){
return $.Deferred().resolveWith(this);
}).fail(function(){
console.log('ajax call failed');
});
})).done(function(){
console.log('when done');
})
.always(function(){
console.log('when always');
})
.fail(function(){
console.log('when fail');
})
问题是,当一个ajax调用失败时,when调用失败。我需要一个解决方案,在所有承诺都兑现后,不管部分或全部承诺是否失败,该解决方案都会称之为“完成”
我在这里查看了答案:
从上面的代码可以看出,我已经实现了公认的解决方案
问题是,done仍然从未被调用,并且总是在一个ajax调用失败时被调用
我哪里做错了
我哪里做错了
不是你,而是$.when()
如何工作
但您可以轻松实现一个函数,该函数将在所有承诺之后resolve
或reject
:
var waitAllRegardlessResult = function(promises) {
var cnt = promises.length,
d = $.Deferred(),
countHandler = function() {
if (--cnt == 0) {
d.resolve();
}
};
promises.map(function(promise) {
promise.always(countHandler);
});
return d.promise();
};
演示:
因此,此函数将返回一个promise对象,该对象在所有promise作为数组传递后
已解析
或已拒绝
这与我的代码在哪里匹配?它是如何循环通过我的所有ajax请求的?@panthro:您使用给定的函数而不是$.when()
。在JSFIDLE页面上,您可以看到用法示例对不起,您的小提琴不清楚。承诺在哪里传递到上述方法?@panthro:20行:waitAllRegardlessResult([a,b])
---第1行和第2行都定义了a
和b
承诺,那么我应该向方法传递什么承诺?不,您没有从那里的答案实现我的解决方案。返回已解析延迟的回调是的第二个参数。然后()
,第一个参数是null
!