递归XHR承诺抛出404错误,没有调用堆栈

时间:2018-06-01 16:27:18

标签: javascript recursion promise xmlhttprequest es6-promise

我有一个函数可以进行服务器调用并返回一个promise,如下所示:

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没有行号或堆栈跟踪,而不是拒绝。这里发生了什么?为什么不正常拒绝?

0 个答案:

没有答案