Skip to content

消除异步的传染性 ​

javascript
function getUser() {
  return fetch(
    'https://my-json-server'
  );
}

function m1() {
  // other works
  return getUser();
}

function m2() {
  // other works
  return m1();
}

function m3() {
  // other works
  return m2();
}

function main() {
  const user = m3();
  console.log(user)
}

function run(func) {
  let cache = [];
  let i = 0;
  const _originFetch = window.fetch;
  window.fetch = (...args) => {
    // 有缓存 交付缓存结果
    if (cache[i]) {
      // 交付缓存结果
      if (cache[i].status === 'fulfilled') {
        return cache[i].data;
      } else if (cache[i].status === 'rejected') {
        throw cache[i].err;
      }
    }
    const result = {
      status: 'pending',
      data: null,
      err: null
    };
    cache[i++] = result;
    // 发送请求
    const prom = _originFetch(...args).then(resp => resp.json()).then(
      resp => {
        result.status = 'fullfilled';
        result.data = resp;
    }, err => {
      result.status = 'rejected';
      result.err = err;
    });
    // 报错
    throw prom;
  }
  try {
    func();
  } catch(err) {
    if (err instanceof Promise) {
      const reRun = () => {
        i = 0;
        func();
      };
      err.then(reRun, reRun);
    }
  }
}

run(main);