IMHO gibt es einige Ungenauigkeiten in Ihrem Code. Vor allem, wenn Sie $.when.apply()
, zwischen .when()
Klammer aufrufen, müssen Sie "$
" als erste Argumente, dann Ihr Array spRequest
. Wenn Sie mit jQuery.Deferred
arbeiten, können Sie das Endergebnis Ihrer Verzögerter (Ajax-Aufrufe usw.) besser kontrollieren. So drücken Sie spRequest
Array Ihre Verzögerter, die so schnell wie möglich ausgeführt werden. $.when.apply($,spRequest)
wartet auf alle Deferreds, die aufgelöst oder zurückgewiesen werden. Ich habe absichtlich self.resolve()
in jedem ajax.fail()
statt self.reject()
aus zwei Gründen:
- Sie Ihre Ajax zählen fehlschlägt;
Wenn in einer Reihe von verzögerten Objekten einer von ihnen fehlschlägt, $.when.fail()
feuert und ich denke, ist nicht das, was Sie suchen, oder besser, ich nehme an, dass die von Ihren AJAX-Aufrufe aufgerufenen Dateien vorhanden sind und korrekt aufgerufen werden können . Auf der anderen Seite, wenn es nicht so ist, haben Sie zwei Möglichkeiten:
- Verwendung
self.reject()
auf ajax.fail()
;
- betrachten status in Ihrer Ajax-Aufruf zu überprüfen:
$.ajax({ statusCode: { 404: function() { //resolve and counter ++ stuffs in here } } });
Hier ist ein Beispiel, dass die Ziele Ihre Bedürfnisse:
* 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'));
im Voraus Apologize für nicht schaffen, die Geige.
Hope meine Antwort hilft.
Dies könnte helfen: Handle gut Fehler in Ajax, und Ihr Code wird in der Lage, die $ .when.apply Zeile zu tun. http: // Stapelüberlauf.com/questions/2810128/try-catch-mit-jquery-ajax-request Verwenden Sie window.onerror, um Fehler zu sehen – Destrif