1
我寫下了下面這段代碼。 makeRequest
被調用,我想在xhr狀態爲0時重試此操作。問題是我無法解決正確的承諾,重試邏輯在第n次嘗試中獲取正確的響應,但未能傳播到調用方法。如何重試一個xhr請求,它在狀態0上遞歸地遞歸至少n次
如何解決此問題。
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!如果您沒有看到上面的「重試」,請點擊刷新。 –
謝謝。這確實解決了我目前的問題,但有沒有辦法解決所有添加到調用堆棧的承諾,如果其中任何一個解決? – arbghl
@arbghl:是的 - 這實際上很簡單,你只需要一個承諾來調用'resolve',並且你所稱的承諾將根據該承諾來解決或拒絕。我已經在上面添加了示例。 –