Рекурсивное обещание XHR выдает ошибку 404 без стека вызовов - PullRequest
0 голосов
/ 01 июня 2018

У меня есть функция, которая выполняет серверный вызов и возвращает обещание, например, так:

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 без номера строки или трассировки стека.Что тут происходит?Почему это не просто отклонение как обычно?

...