2016-06-10 18 views
0

Mein Code funktioniert einwandfrei, solange jede Anfrage erfolgreich ist. Aber wenn es nur einen einzigen Fehler gibt, "feuert" immer "nicht".Wird immer nicht ausgelöst, wenn nur ein Fehler auftritt

Ich erwarte "immer" immer zu feuern. Bisher hatte ich kein Glück eine Antwort auf mein Problem zu finden. "complete" (was ich für einzelne Anfragen verwende) funktioniert nicht. "dann" auch nicht.

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); 
    } 
    } 
); 

meine "Es gab einige Probleme" Abschnitt erreicht nie

+0

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

Antwort

0

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.

Verwandte Themen