2017-06-19 7 views
0

Ich habe einige Probleme mit mehreren JQuery AJAX-Aufruf, gibt es Timeout-Fehler, aber woher weiß ich, welche Anfrage Fehler das ist?Wie behandelt man mehrere Ajax Request Fehler mit Deferred?

$.when(ajaxDeferred1, ajaxDeferred2) 
    .done(function(result1, result2) {}) 
    .fail(function(response, statusText) { 
    // how do I know which(ajaxDeferred1 or ajaxDeferred2) ajax call error this is? 
}); 

ajaxDeferred1

$.ajax({ 
    method: 'GET', 
    url: xxx, 
    timeout: 5000, 
}); 

Ich weiß, dass ich Fehler behandeln kann durch '.fail()' auf jede Anforderung setzen, aber ist es eine Möglichkeit Griff Fehler über Art und Weise?

Gehen Sie weiter, kann ich so umgehen?

$.when(ajaxDeferred1, ajaxDeferred2) 
    .done(function(result1, result2) {}) 
    .fail(function(errorForRequest1, errorForRequest2) { 
    // handle error 
}); 

EDIT:

Ich glaube, ich muss meine Frage klarer machen. Im obigen Beispiel:

$.when(ajaxDeferred1, ajaxDeferred2) 
    .done(function(result1, result2) {}) 
    .fail(function(errorForRequest1, errorForRequest2) { 
    // if all request has done, but one or more request has got error, return the error here then! 
    // So I can handle which part UI should show and which UI part I should hide due to the error! 
}); 

Ich will Ergebnis ‚done‘ werden, wenn alle fehlerfrei erfolgt ist, und erhalten ‚Fehler‘, wenn alle getan wird, aber eine oder mehrere Anfrage wurde auftretendes Problem und bringt sie alle zusammen in '.fail()'.

Antwort

1

I @Miguel Mota Antwort mögen. Aber als Alternative erhalten Sie Ihr zurückgestelltes Objekt zurück, wenn es fehlschlägt. So können Sie einige Daten hinzufügen:

var dfd1 = jQuery.ajax({ 
    method: 'GET', 
    url: 'some request that fails first', 
    timeout: 1 
}); 

dfd1.id = 1; 

var dfd2 = jQuery.ajax({ 
    method: 'GET', 
    url: 'some request that fails second', 
    timeout: 1000 
}); 

dfd2.id = 2; 

jQuery.when(dfd1, dfd2) 
    .done(function() { }) 
    .fail(function (request) { 
     // id: 1 
     console.log('id: ' + request.id); 
    }); 
+0

Hallo, das ist näher an meine Intension. Das einzige Problem ist 'fail()' blockiert andere Ajax-Anfragen, um fortzufahren, ich habe meine Frage bearbeitet. – Kim

1

Sie können .always() verwenden und darin jedes Versprechen durchlaufen und prüfen, ob es aufgelöst oder fehlgeschlagen ist.

var promises = [ajaxDeferred1, ajaxDeferred2] 

$.when.apply($, promises) 
    .always(function() { 
    $.each(promises, function(i) { 
     this.done(function(result) { 
     console.log('promise', i, 'resolved'); 
     }).fail(function(error) { 
     console.log('promise', i, 'failed'); 
     }); 
    }); 
    }); 

JSFiddle Demo: https://jsfiddle.net/pr45eov1/3/

Verwandte Themen