等待一段时间继续执行-- setTimeout

本文介绍了一个在前端开发中遇到的问题,即多个地址组件同时加载导致数据获取冲突。通过使用Promise封装setTimeout实现异步等待,确保在请求锁释放后获取到数据。当请求失败时,会进行重试,并在超过一定次数后返回空数组。这种方法可以有效地避免因并发导致的数据不一致。

前言

我的业务场景:地址组件从脚本那里拿接口数据,如果表单有两个地址组件,两个地址组件同时加载,以致于第二个组件拿不到数据。所以得每100毫秒调用获取数据的方法,等到第一个组件地址api请求完,然后就有数据返回了。

正文

promise来包装一下setTimeout()来实现一个sleep()

const sleep = function (time) {
  return new Promise((resolve) => setTimeout(resolve, time))
}

地址组件数据返回

/**
 * 地址api数据请求
 */
// 请求锁
let requestLock = true
const getCityData = async function (frequency = 1) {
  let cityData = utils.LS.get('cityData')
  if (cityData && cityData.length > 0) return cityData
  try {
    if (requestLock) {
      requestLock = false
      const res = await axios.get('https://......static/district.json')
      utils.LS.set('cityData', res.data)
      requestLock = true
      return res.data
    } else {
      // 如果表单有两个地址组件,两个地址组件同时加载,以致于第二个组件拿不到数据,
      // 所以如果window.cityData没有数据则每100毫秒调用本身这个方法,等到第一个地址api请求完,window.cityData就有数据返回了
      await sleep(100)
      return getCityData()
    }
  } catch (error) {
    console.log(error)
    requestLock = true
    // 如果出现错误重试3次
    if (frequency > 3) {
      return []
    }
    await sleep(300)
    return getCityData(frequency + 1)
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值