Loading

1s内控制向某个请求请求的次数

背景

有的时候后端提供的接口对相同的IP进行限制,在某个时间内不能发送超过X条的请求,一旦超过指定的请求数会导致后续请求接口会出现异常。

效果

需求

比如:在1s内最多同时发送2个请求,多出来的请求在后续的1s或者后续的Ns中发起

代码

<template>
  <div class="app">
    <el-divider content-position="center"
      >1.1s内向某个IP最多发送2个请求</el-divider
    >
    <el-button type="primary" @click="send_request">发送请求</el-button>
  </div>
</template>

<script>
import axios from 'axios'
export default {
  data() {
    return {}
  },
  methods: {
    send_request() {
      // 需要发送的请求个数
      const need_send_request_num = 5
      const queue_arr = []
      /**
       *
       * @param total_request_num 需要向服务请求的总数
       * @param max_request_num  向某个IP最大请求数量
       * @param startIndex       第N个请求
       */
      const foo = (total_request_num, max_request_num = 2, startIndex = 0) => {
        if (startIndex >= total_request_num) {
          // console.log('所有请求完成了')
          // TODO:所有请求完成时
          Promise.all(queue_arr).then((res) => {
            console.log(res)
          })
        } else {
          const endIndex =
            startIndex + max_request_num > total_request_num
              ? total_request_num
              : startIndex + max_request_num
          let i = startIndex
          for (; i < endIndex; i++) {
            queue_arr.push(this.fetchData(i))
          }
          setTimeout(() => {
            foo(total_request_num, max_request_num, i)
          }, 1000)
        }
      }
      foo(need_send_request_num)
    },
    async fetchData(index) {
      const res = await axios.get('https://httpbin.org/get', {
        params: {
          index,
        },
      })
      return res.data
    },
  },
}
</script>

<style lang="less" scoped>
.app {
  padding: 40px;
}
</style>

posted @ 2024-07-03 22:03  ^Mao^  阅读(11)  评论(0编辑  收藏  举报