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

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

前言

我的业务场景:地址组件从脚本那里拿接口数据,如果表单有两个地址组件,两个地址组件同时加载,以致于第二个组件拿不到数据。所以得每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)
  }
}
在JavaScript中,我们可以使用几种方法来等待一段时间。以下是其中一些常用的方法: 1. setTimeout函数:setTimeout函数允许我们在指定的时间间隔后执行一段代码。它接受两个参数,第一个参数是要执行的代码,第二个参数是延迟的时间(以毫秒为单位)。 示例代码: ``` setTimeout(function() { // 在延迟后执行的代码 }, 2000); // 延迟2秒执行 ``` 2. setInterval函数:setInterval函数与setTimeout函数类似,但它会在指定的时间间隔内重复执行代码。它也接受两个参数,第一个参数是要执行的代码,第二个参数是时间间隔(以毫秒为单位)。 示例代码: ``` setInterval(function() { // 每隔一段时间执行的代码 }, 1000); // 每隔1秒执行一次 ``` 3. Promise和async/await:在ES6中引入了Promise和async/await来处理异步操作。我们可以使用Promise的`setTimeout`方法或async/await结合`setTimeout`来实现等待一段时间。 Promise示例代码: ``` function wait(timeout) { return new Promise(resolve => { setTimeout(resolve, timeout); }); } wait(2000).then(() => { // 在延迟后执行的代码 }); ``` async/await示例代码: ``` async function wait(timeout) { await new Promise(resolve => { setTimeout(resolve, timeout); }); } async function doSomething() { await wait(2000); // 在延迟后执行的代码 } doSomething(); ``` 这些是JavaScript中常用的等待一段时间的方法。你可以根据具体的需求选择适合的方法来实现等待功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值