У меня есть функция, которая выполняет серверный вызов и возвращает обещание, например, так:
function postToServer(url, body) {
let xhr = new XMLHttpRequest();
xhr.open(`POST`, url, true);
xhr.setRequestHeader(`Content-type`, `application/json`);
return new Promise((resolve, reject) => {
xhr.onload = () => {
if(xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) {
resolve();
} else {
reject(xhr.status);
}
};
xhr.send(body);
});
}
Это, кажется, работает нормально для моего случая.Однако проблема возникает, когда я хочу повторить этот вызов в случае сбоя.У меня есть другая функция, которая выполняет этот процесс:
function postToServerAndRetryOnFail(url, body, failedAttempts = 0) {
return new Promise((resolve, reject) => {
postToServer(url, body).then(() => {
resolve();
}, statusCode => {
failedAttempts++;
if(failedAttempts <= maxAttempts) {
wait(intervalBetweenAttempts).then(() => {
postToServerAndRetryOnFail(url, body, failedAttempts);
});
} else {
reject(statusCode);
}
});
});
}
Я ожидаю, что произойдет здесь, когда запрос не выполняется, он пытается, пока не достигнет максимального числа попыток, и в этот момент он возвращаетотказ.Обратите внимание, что функция работает так, как и ожидалось для успешных запросов.
На самом деле происходит то, что происходит сбой, повторы, сбои ... (как и ожидалось), пока не будет достигнуто максимальное количество попыток.Затем, вместо отклонения, я просто получаю uncaught exception: 404
без номера строки или трассировки стека.Что тут происходит?Почему это не просто отклонение как обычно?