使用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
    评论
Vue 3是一种流行的JavaScript框架,用于构建用户界面。它采用了一些新的特性和改进,使得开发更加高效和灵活。Node.js一个基于Chrome V8引擎的JavaScript运行时环境,它可以让你在服务器端运行JavaScript代码。 关于Vue 3和Node.js的结合,你可以使用Vue CLI快速搭建一个Vue 3项目,并且使用Node.js作为后端服务器来处理数据和提供API。下面是一些具体的步骤可以供你参考: 1. 首先,确保你已经安装了Node.js和Vue CLI。你可以在命令行中运行以下命令来检查它们是否已经安装: ```bash node -v vue --version ``` 2. 如果你没有安装Node.js,请到官方网站下载并安装最新版本。安装完成后,你应该能够使用`node -v`命令来查看Node.js的版本号。 3. 如果你没有安装Vue CLI,请打开命令行并运行以下命令来全局安装Vue CLI: ```bash npm install -g @vue/cli ``` 4. 安装完成后,你可以使用`vue --version`命令来查看Vue CLI的版本号。 5. 接下来,使用Vue CLI创建一个新的Vue 3项目。在命令行中运行以下命令: ```bash vue create my-project ``` 这将使用默认的预设选项创建一个新的Vue 3项目。你可以根据需要选择其他预设选项。 6. 进入项目目录: ```bash cd my-project ``` 7. 在项目目录下启动开发服务器: ```bash npm run serve ``` 这将启动一个本地开发服务器,并且你可以在浏览器中访问`http://localhost:8080`来查看你的Vue 3应用。 8. 在`src`目录下创建一个名为`server.js`的文件,用于编Node.js后端代码。你可以使用Express.js等框架来搭建你的后端。 9. 在`server.js`文件中,你可以定义路由和处理API请求的逻辑。这里有一个简单的示例: ```javascript const express = require('express'); const app = express(); app.get('/api/data', (req, res) => { // 处理API请求逻辑 res.json({ message: 'Hello from the backend!' }); }); app.listen(3000, () => { console.log('Server running on port 3000'); }); ``` 10. 使用以下命令安装Express.js: ```bash npm install express ``` 11. 在命令行中运行以下命令来启动Node.js后端服务器: ```bash node server.js ``` 这将启动一个运行在`http://localhost:3000`的后端服务器。 现在,你的Vue 3前端应用和Node.js后端服务器已经连接起来了。你可以在Vue组件中使用`axios`或`fetch`等工具发送HTTP请求并与后端进行通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值