消除异步的传染性

根据下面代码实现同步调用:
function getUser() {
  return fetch('http://www.baidu.com?123')
}

function m1() {
  return getUser()
}

function m2() {
  return m1()
}

function m3() {
  return m2()
}

function main() {
  const user = m3()
  console.log(user)
}
解决办法:
function run(func) {
  let cache = []
  let i = 0
  const _originalFetch = window.fetch
  window.fetch = (...args) => {
    if(cache[i]) {
      // 交付缓存结果
      if(cache[i].status === 'fulfilled') {
        return cache[i].data
      }
      if(cache[i].status === 'rejected') {
        throw cache[i].err
      }
    }

    const result = {
      status: 'pending',
      data: null,
      err: null
    }
    cache[i++] = result

    // 发送请求
    const prom = _originalFetch(...args)
      .then(resp => resp.json())
      .then(res => {
        result.status = 'fulfilled'
        result.data = res
      }, err => {
        result.status = 'rejected'
        result.err = err
      })

    // 报错
    throw
  }

  try {
    func()
  } catch(err) {
    if(err instanceof Promise) {
      const reRun = () => {
        i = 0
        run(func)
      }
      err.then(reRun, reRun)
    }
  }
}
run(main)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@前端小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值