只要每个请求都返回成功,我的代码就可以正常运行。但如果只有一个单一的失败,“总是”不会发射。
我希望“永远”总是开火。到目前为止,我没有找到解决问题的答案。 “完整”(我用于单个请求)不起作用。 “那么”也没有。
var counter = { ok:0, fail:0 };
for(var i in toDoList)
{
spRequest[i] = $.ajax({...})
.done( function() { counter.ok ++; } )
.fail( function() { counter.fail ++; } );
}
$.when.apply(this, spRequest)
.always
(
function()
{
if ( spResp.ok == paybackTable.length )
{
console.log( "everything went just fine" );
}
else
{
console.log( "there were some problems:" );
console.log( "- Requests OK: " + counter.ok );
console.log( "- Requests failed: " + counter.fail );
}
}
);
我的“有一些问题”部分从未到达
答案 0 :(得分:0)
恕我直言,您的代码中存在一些不准确之处。首先,当您在$.when.apply()
括号之间调用.when()
时,必须将“$
”作为第一个参数,然后将数组spRequest
。如果您使用jQuery.Deferred
,您可以更好地控制Deferreds的最终结果(ajax调用等等)。
所以,你推送spRequest
数组你的Deferreds,尽快执行。 $.when.apply($,spRequest)
等待解决或拒绝所有延期。
我故意将self.resolve()
放在每个ajax.fail()
而不是self.reject()
中,原因有两个:
如果在一系列Deferred对象中,其中一个失败,$.when.fail()
会触发,我认为不是您要搜索的内容,或者更好的是,我认为您的ajax调用调用的文件存在并可以正确调用。另一方面,如果不是这样,你有两种可能性:
self.reject()
上使用ajax.fail()
; $.ajax({
statusCode: {
404: function() {
//resolve and counter ++ stuffs in here
}
}
});
这是一个满足您需求的示例:
* index.php *
<html>
<head>
<title>TEST DEFERRED</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
</head>
<body>
<h1>TEST DEFERRED</h1>
<script src="js/test.js"></script>
</body>
</html>
* test.js *
var counter = { ok:0, fail:0 }
,toDoList = [1,2,3,4,5,6,7,8,9,10]
,spRequest = [];
for(var i in toDoList)
{
console.log(i, i&1);
if(i&1)
{
console.log('odd, request an ok ajax call');
spRequest[i] = jQuery.Deferred(function(){
console.log('function ok called!');
var self = this;
$.ajax({
url: 'ajax/ajax_return_ok.php',
async: true,
data : {},
type: 'post',
dataType: 'json'
}).done( function(d) {
console.log(d);
if(d.is_error)
{
counter.fail ++;
self.resolve();
} else {
counter.ok ++;
self.resolve();
}
}).fail( function(j) {
console.log(j.responseText);
//# fail of ajax call
counter.fail ++;
self.resolve();
});
});
} else {
console.log('odd, request an error ajax call');
spRequest[i] = jQuery.Deferred(function(){
console.log('function error called!');
var self = this;
$.ajax({
url: 'ajax/ajax_return_error.php',
async: true,
data : {},
type: 'post',
dataType: 'json'
}).done( function(d) {
console.log(d);
if(d.is_error)
{
counter.fail ++;
self.resolve();
} else {
counter.ok ++;
self.resolve();
}
}).fail( function(j) {
console.log(j.responseText);
//# fail of ajax call
counter.fail ++;
self.resolve();
});
});
}
}
jQuery.when.apply($,spRequest).done(function(){
console.log('when done');
}).fail(function(){
console.log('when fail');
}).always(function(){
if ( counter.fail === 0 )
{
console.log( "everything went just fine" );
}
else
{
console.log( "there were some problems:" );
console.log( "- Requests OK: " + counter.ok );
console.log( "- Requests failed: " + counter.fail );
}
});
* ajax_return_error.php *
<?php
echo json_encode(array('is_error' => true,'error_message' => 'this is an error message'));
* ajax_return_ok.php *
<?php
echo json_encode(array('is_error' => false,'result' => 'ok'));
提前道歉,因为没有创建小提琴。
希望我的回答有所帮助。