指数补偿

在网络环境不稳定的情况下,以指数级别的时间间隔发送请求,直到任意某一次请求得到了返回

function request(url) {
  // 判断是否已经完成请求
  let resolved = false;
  // 次数
  let t = 1;

  return new Promise((resolve, reject) => {
    function doFetch() {
      // 如果已经完成请求,或者次数已达上限,则直接返回
      if (resolved || t > 16) {
        return;
      }
      // 否则发送请求
      fetch(url).then((resp) => {
        // 如果标记还处在未完成的状态
        if (!resolved) {
          // 将结果返回
          resolve(resp);
          // 将标记置为已完成
          resolved = true;
        }
      });
      // 指数级的时间间隔发送请求
      setTimeout(() => {
        // 调用自己
        doFetch();
        t *= 2;
      }, t * 100);
    }

    // 首次调用
    doFetch();
  });
}