Ich habe das folgende Stück Code geschrieben. makeRequest
wird aufgerufen, und ich möchte dies wiederholen, wenn xhr Status 0 ist. Das Problem ist, ich bin nicht in der Lage, die richtige Versprechen zu lösen, die Wiederholungslogik ruft die richtige Antwort im n-ten Versuch, aber nicht zur Aufrufer-Methode zu propagieren.Wie wiederhole ich eine xhr-Anfrage, die ein Versprechen rekursiv für mindestens n-mal auf Status 0
Wie behebe ich dieses Problem?
var makeRequest = function(method, urlToBeCalled, payload) {
var deferred = $q.defer();
var xhr = new XMLHttpRequest();
xhr.open(method, encodeURI(urlToBeCalled), true);
setHttpRequestHeaders(xhr); // set headers
var response;
xhr.onload = function() {
if (xhr.status === 200 && xhr.readyState === 4 && xhr.getResponseHeader('content-type') !==
'text/html') {
try {
response = JSON.parse(xhr.response);
deferred.resolve(response);
} catch (e) {
deferred.reject(e);
}
} else if (xhr.status === 0) {
// retry here;
deferred.resolve(makeRequest(method, urlToBeCalled, payload));
} else {
try {
response = JSON.parse(xhr.response);
deferred.reject(response);
} catch (e) {
deferred.reject(xhr.response);
}
}
};
xhr.onerror = function() {
deferred.reject(xhr.response);
};
xhr.send(payload);
return deferred.promise;
};
Doh! Wenn oben nicht angezeigt wird, dass Sie nicht mehr versuchen, klicken Sie auf Aktualisieren. –
Danke. Dies löst zwar mein aktuelles Problem, aber gibt es eine Möglichkeit, alle Versprechen zu lösen, die zum Call-Stack hinzugefügt werden, wenn einer davon gelöst wird? – arbghl
@arbghl: Ja - es ist wirklich wirklich einfach, du nennst einfach "Entschlossenheit" mit einem Versprechen, und das Versprechen, auf das du es nennst, wird basierend auf diesem Versprechen auflösen oder ablehnen. Ich habe oben Beispiele hinzugefügt. –