2016-06-07 7 views
0

Auf den ersten Blick scheint es, Sie könnten ein jqXHR-Objekt von jquery in ein ES6-Versprechen konvertieren. Wenn die Anforderung fehlschlägt, gibt der Error-Handler jedoch eine Endlosschleife ein, da der an den Catch/Error-Callback übergebene Parameter jqXHR selbst ist. Daher wird die Promise mit einem an sich selbst zurückgewiesenen thinable abgelehnt, was zu einer Endlosschleife führt.Promise.resolve auf jqXHR Ajax verursacht Endlosschleife

Was ist der beste Weg, um eine jqXHR in eine Promise zu konvertieren, ohne eine Endlosschleife im Fehlerfall zu verursachen?

Zwei mögliche Lösungen, an die ich gedacht habe, sind irgendwie das originale XMLHttpRequest zu erhalten und das Versprechen damit bei einem Fehler abzulehnen, oder das jqXHR in ein anderes Objekt ohne eine Methode einzuschließen.

Beide scheinen jedoch eher peinlich? Gibt es eine Möglichkeit, Promise davon abzuhalten, den Funktionen zu folgen, auf denen sie gelöst/abgelehnt wird? Oder weniger wünschenswert, eine Möglichkeit, die ursprüngliche XMLHttpRequest von einem jqXHR zu bekommen?

Antwort

0

Wie wäre es, die $.ajax Anruf mit einem Versprechen zu wickeln?

Etwas wie:

var request = new Promise(function(resolve, reject) { 
    $.ajax({ 
     url: '...', 
     data: { ... }, 
     method: 'POST', 
     success: function(response) { 
      resolve(response); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      reject(errorThrown); 
     } 
    }); 
}); 

request.then(...).catch(...); 
+0

Das noch eine Endlosschleife wird, weil die Reaktionsparameter der jqXHR ist, die sich der Fehler-Callback übergibt. Und ablehnen versucht, den tables zu folgen. – Thayne

+0

Sie haben Recht! Bitte sehen Sie mir die bearbeitete Antwort. Jetzt erhält die 'error' -Funktion drei Argumente anstelle von eins. –

Verwandte Themen