使用JS,写了一个轮询发送请求的工具。

版本

  • axios: ^1.2.0

  • vue: 2

// 这里的内容是:封装的axios请求拦截器。
import axios from "./request";

/**
 * @Polling {轮询的实现}
 */
class Polling {
  constructor(second) {
    this.time = second * 1000;
    this.requests = [];
    this.finishCount = 0;
    this.__timer = null;
    this.__isStop = false;
  }
  /**
   * @注册需要轮询的多个请求
   * @param {Array} list 配置列表
   */
  registeredMore(list) {
    list.forEach((config) => {
      this.registered(config);
    });
  }
  /**
   * @注册单个请求
   * @param {Object} options
   * @param {options} method 请求方式
   * @param {options} url 请求路径
   * @param {options} data 请求参数
   */
  registered({ callback, method, url, data }) {
    const config = {
      method,
      url,
      callback,
    };
    const lowerMethod = method.toLowerCase();
    if (["get", "delete"].includes(lowerMethod)) {
      config.params = data;
    } else {
      config.data = data;
    }
    this.requests.push(config);
  }

  __handleCallbackFinishCount(res, callback) {
    this.finishCount += 1;
    callback(res);
    if (this.finishCount == this.requests.length) {
      this.finishCount = 0;
      this.startPolling();
    }
  }

  __sendRequests(config) {
    const { callback, ...payload } = config;
    const request = axios(payload);
    request
      .then((res) => this.__handleCallbackFinishCount(res.data, callback))
      .catch((err) => this.__handleCallbackFinishCount(err, callback));
  }

  /**
   * @立即发送全部请求
   */
  allSend() {
    this.requests.forEach((config) => {
      this.__sendRequests(config);
    });
  }

  /**
   * @开始定时器 > 一般用户初始化之后进行调用
   */
  startPolling() {
    if (this.__isStop) return;
    this.__timer = setTimeout(() => {
      this.allSend();
    }, this.time);
  }

  /**
   * @关闭轮询
   * @param {Boolean} isInstantOpen  true:在调用此方法时直接关闭, false:等待当前轮询周期结束关闭。
   */
  closePolling(isInstantClose = false) {
    if (isInstantClose == true && this.__timer != null) {
      clearTimeout(this.__timer);
    }
    this.__isStop = true;
  }
  /**
   * @打开轮询
   * @param {Boolean} isInstantOpen true:在调用此方法时直接发送请求, false:等待轮询的时长。
   */
  openPolling(isInstantOpen = false) {
    this.__isStop = false;
    if (isInstantOpen == true) {
      this.allSend();
    } else {
      this.startPolling();
    }
  }
}

function autoStart(polling, initRequestList) {
  polling.registeredMore(initRequestList);
  polling.allSend();
}

/**
 * 暴露给外部的接口
 * @param {*} second 时间/秒
 * @param {*} initRequestList  请求列表:如果数组中有内容,则自动开始执行。
 * @returns polling
 */

export function pollingEffect(second, initRequestList = []) {
  const polling = new Polling(second);
  if (initRequestList.length > 0) {
    autoStart(polling, initRequestList);
  }
  return {
    registeredMore: polling.registeredMore.bind(polling),
    registered: polling.registered.bind(polling),
    allSend: polling.allSend.bind(polling),
    startPolling: polling.startPolling.bind(polling),
    openPolling: polling.openPolling.bind(polling),
    closePolling: polling.closePolling.bind(polling),
  };
}

参数

  • second:秒数(数字)

  • 初始化的initRequestList<Object>,传入一个数组, 如果这个数组里面存在内容则自动开始轮询

  • 如果不使用,第二个参数不传的情况下,不会自动开启轮询。

 const polling = pollingEffect(1, [
      {
        url: "后端的路径",
        method: "get",
        data: { time: new Date().getTime() }, // 参数 
        callback: (data) => {
          console.log(data);
        },
      },
    ]);
}

方法解析:

  • registeredMore

  • 初始化多个请求(配置)

  • 参数

  • Array<Object>

polling.registeredMore([
    {    
        url: "后端的路径01",
        method: "get",
        data: { time: new Date().getTime() }, // 参数 
        callback: (data) => {
          console.log(data);
        },
    },
    {    
        url: "后端的路径02",
        method: "get",
        data: { time: new Date().getTime() }, // 参数 
        callback: (data) => {
          console.log(data);
        },
     },
])
  • registered

  • 初始化一个请求,

  • 参数

  • Object

polling.registered({
    url: "后端的路径",
    method: "get",
    data: { time: new Date().getTime() }, // 参数 
    callback: (data) => {
      console.log(data);
    },
})
  • allSend()

  • 立即发送请求(所有初始化过的请求)

polling.allSend()

  • startPolling()

  • 开启定时器进行轮询。

polling.startPolling()
  • openPolling(isInstantOpen)

  • 打开轮询

  • 参数

  • isInstantOpen = true: 在调用此方法时直接发送请求。

  • isInstantOpen = false:相当于重新调用startPolling方法(默认)。

polling.openPolling()
  • closePolling(isInstantClose)

  • 关闭轮询

  • 参数

  • isInstantClose = true: 在调用此方法时直接关闭。

  • isInstantClose = false:等待当前轮询周期结束后关闭(默认)

polling.closePolling()

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在JavaScript中,可以使用`setInterval()`函数来定时轮询接口请求数据。具体步骤如下: 1. 使用`setInterval()`函数设定轮询时间间隔和要执行的函数。 例如,下面的代码将每隔5秒钟执行一次`getData()`函数: ``` setInterval(getData, 5000); ``` 2. 在要执行的函数中,使用AJAX或Fetch等方式发送接口请求,并在请求成功后对数据进行处理。 例如,下面的代码使用Fetch发送GET请求获取数据,并在获取成功后将数据输出到控制台: ``` function getData() { fetch('http://example.com/data') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error(error)); } ``` 3. 如果需要在页面加载时立即执行一次接口请求,可以在页面加载完成后手动执行一次函数。 例如,下面的代码使用jQuery在页面加载完成后执行一次`getData()`函数: ``` $(document).ready(function() { getData(); }); ``` 这样,就可以使用JavaScript定时轮询接口请求数据了。注意要根据具体情况调整轮询时间间隔和请求方式等参数,避免对服务器造成过大的负担。 ### 回答2: 在JavaScript中,可以使用setInterval函数来实现定时轮询接口请求数据的功能。具体的法如下: 1. 首先,定义一个请求数据的函数,例如getData(),该函数用来发送请求并处理返回的数据。 2. 使用setInterval函数来设置定时器,语法如下: setInterval(getData, 1000); //每隔1秒执行一次getData函数 上述代码表示每隔1秒执行一次getData函数,从而实现定时轮询接口请求数据。 3. 在getData函数中,使用XMLHttpRequest或fetch等方法发送请求,获取数据。可以参考以下示例代码: function getData() { var xhr = new XMLHttpRequest(); xhr.open('GET', '接口URL', true); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { var data = JSON.parse(xhr.responseText); //对返回的数据进行处理 } }; xhr.send(); } 上述代码使用XMLHttpRequest发送GET请求,并在请求成功后对返回的数据进行处理,你可以根据接口的具体要求进行适当修改。 4. 在处理完返回的数据后,你可以根据实际需求进行相应的操作,例如更新页面内容、显示数据等。 总结:通过使用setInterval函数设置定时器,并在定时器函数中调用发送请求的函数,可以实现定时轮询接口请求数据的功能。 ### 回答3: 定时轮询接口请求数据的JavaScript代码可以通过以下步骤实现: 1. 首先创建一个定时器,使用JavaScript的`setInterval`函数,并设置轮询的时间间隔,例如每隔5秒钟请求一次数据。 2. 在定时器的回调函数中,使用JavaScript的`XMLHttpRequest`对象或者`fetch`函数发起HTTP请求,向目标接口请求数据。 3. 在HTTP请求的回调函数中,可以通过`status`属性判断请求是否成功,通过`responseText`属性获取响应数据。 4. 根据需要对获取的数据进行处理,例如解析JSON、修改页面元素等操作。 5. 如果不需要继续轮询数据,则可以在回调函数中调用`clearInterval`函数,停止定时器。 以下是一个简单的示例代码,每隔5秒钟向接口请求数据并输出到控制台: ```javascript // 定义轮询时间间隔(单位:毫秒) var interval = 5000; // 定义轮询函数 function poll() { // 发起HTTP请求 var xhr = new XMLHttpRequest(); xhr.open("GET", "http://example.com/api", true); xhr.onreadystatechange = function() { // 判断请求是否完成且成功返回 if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) { // 获取响应数据 var data = xhr.responseText; // 处理数据 console.log(data); } }; xhr.send(); } // 启动定时器 setInterval(poll, interval); ``` 请注意,上述示例中的接口请求使用JavaScript实现的。如果使用了现代的前端框架(如Vue.js、React等),也可以使用相应的框架提供的工具函数或生命周期钩子函数来实现定时轮询接口请求数据的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值