方案 特点 适用场景
vue-request 简洁易用,基于函数式调用,内置轮询、防抖、节流等特性 快速实现轮询功能
@vueuse/core 基于 Composition API,与 Vue 3 深度集成,提供 useIntervalFn 等工具函数 更加灵活控制轮询逻辑
rxjs 强大的响应式编程库,支持复杂的数据流处理 需要精细控制数据流和错误处理

方案详解与示例

1. 使用 vue-request 实现轮询请求

vue-request 是一个类 React 的 ahooks 风格的 Vue 数据请求 Hook 库,非常适合 Vue 3 + Composition API 项目。

安装:

npm install vue-request

示例代码

import { defineComponent } from 'vue'
import useRequest from 'vue-request'
import axios from 'axios'
export default defineComponent({
  setup() {
    const fetchData = async () => {
      const res = await axios.get('/api/realtime-data')
      return res.data
    }
    const { data, loading } = useRequest(fetchData, {
      pollingWhenHidden: false, // 页面隐藏时不轮询
      pollingInterval: 5000,     // 每5秒请求一次
    })
    return () => (
      <div>
        {loading.value ? '加载中...' : JSON.stringify(data.value)}
      </div>
    )
  }
})

优势:

  • 内置轮询、缓存、错误重试等功能

  • 支持自动取消请求

  • 可与 Vue 组件生命周期良好配合

2. 使用 @vueuse/core 实现轮询

@vueuse/core 提供了大量 Vue 3 的组合式函数,其中 useIntervalFn 是实现轮询的理想选择。

安装:

npm install @vueuse/core

示例代码


import { defineComponent, ref } from 'vue'
import { useIntervalFn } from '@vueuse/core'
import axios from 'axios'
export default defineComponent({
setup() {
const data = ref(null)
const loading = ref(false)
const fetchData = async () => {
loading.value = true
try {
const res = await axios.get('/api/realtime-data')
data.value = res.data
} catch (error) {
console.error('请求失败:', error)
} finally {
loading.value = false
}
}
const { pause, resume, isActive } = useIntervalFn(fetchData, 5000, {
immediate: true,
callback: fetchData
})
return () => (
<div>
<button onClick={isActive.value ? pause : resume}>
{isActive.value ? '暂停轮询' : '开始轮询'}
</button>
{loading.value ? '加载中...' : JSON.stringify(data.value)}
</div>
)
}
})

优势:

  • 精细控制轮询启动/暂停

  • 支持组件卸载时自动清理定时器

  • 可与其他组合函数结合使用(如 useFetch)

3. 使用 rxjs 实现轮询

RxJS 是一个强大的响应式编程库,适合需要构建复杂异步数据流的场景。

安装:

npm install rxjs

示例代码


import { defineComponent, onMounted, onUnmounted, ref } from 'vue'
import { interval, Subscription, from } from 'rxjs'
import { switchMap } from 'rxjs/operators'
import axios from 'axios'
export default defineComponent({
setup() {
const data = ref(null)
const loading = ref(false)
const error = ref(null)
let subscription: Subscription
onMounted(() => {
subscription = interval(5000).pipe(
switchMap(() => {
loading.value = true
return from(axios.get('/api/realtime-data'))
})
).subscribe({
next: (res) => {
data.value = res.data
loading.value = false
},
error: (err) => {
error.value = err.message
loading.value = false
}
})
})
onUnmounted(() => {
if (subscription) subscription.unsubscribe()
})
return () => (
<div>
{loading.value && <p>加载中...</p>}
{error.value && <p style="color: red;">{error.value}</p>}
{data.value && <pre>{JSON.stringify(data.value, null, 2)}</pre>}
</div>
)
}
})

优势:

  • 构建复杂的数据流(如合并多个请求、节流、过滤)

  • 错误处理更强大

  • 支持取消订阅,避免内存泄漏

轮询的应用场景分析

场景 描述 推荐方案
实时订单状态更新 用户查看订单状态是否已支付或完成 @vueuse/core 或 vue-request
后台任务进度监控 如文件上传、视频转码等长时间任务 rxjs(便于链式处理)
聊天应用中的新消息检测 当前页面未使用 WebSocket 时 vue-request(简洁高效)
数据大屏展示 多个图表定期刷新数据 @vueuse/core(可统一控制)

轮询的注意事项

1. 性能优化:

控制轮询频率,避免频繁请求影响性能。页面不可见时暂停轮询(如使用 visibilitychange 事件)

2. 防止内存泄漏

在组件销毁时清除定时器或取消订阅

3. 错误处理机制

请求失败时进行重试或提示用户

4. 服务器压力

尽量减少并发请求数量,合理设置间隔时间

总结:

根据你的项目需求和技术栈,可以选择最适合的轮询方案。对于大多数中小型项目,推荐使用 vue-request  @vueuse/core;如果你有复杂的异步流程需求,rxjs 是更好的选择。

Vue 中实现轮询请求的三种主流方案:vue-request、@vueuse/core 与 RxJS 实战解析的更多相关文章

  1. vue中通过路由跳转的三种方式

    原文:https://blog.csdn.net/qq_40072782/article/details/82533477 router-view 实现路由内容的地方,引入组件时写到需要引入的地方需要 ...

  2. vue中监视对象内部变化的三种方法

    一,对整个对象监视 watch:{ obj:{ handler(newV,oldV){ console.log('obj changed') }, deep: true,//深度遍历 immediat ...

  3. vue中采用axios发送请求及拦截器

    这几天在使用vue中axios发送get请求的时候很顺手,但是在发送post请求的时候老是在成功的回调函数里边返回参数不存在,当时就纳闷了,经过查阅资料,终于得到了解决方案,在此做一总结: 首先我们在 ...

  4. Ajax轮询请求

    Ajax轮询请求 什么是轮询? 轮询(polling):客户端按规定时间定时向服务端发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接. Ajax轮询需要服务器有很快的处理速度与快速响应. ...

  5. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  6. 【MySQL】锁——查看当前数据库锁请求的三种方法 20

    MySQL提供了查看当前数据库锁请求的三种方法:1. show  full  processlist命令  观察state和info列 2. show engine  innodb status\G ...

  7. Velocity中加载vm文件的三种方式

    Velocity中加载vm文件的三种方式: a.  加载classpath目录下的vm文件 /** * 初始化Velocity引擎 * --VelocityEngine是单例模式,线程安全 * @th ...

  8. (转)在网页中JS函数自动执行常用三种方法

    原文:http://blog.sina.com.cn/s/blog_6f6b4c3c0100nxx8.html 在网页中JS函数自动执行常用三种方法 在网页中JS函数自动执行常用三种方法 在HTML中 ...

  9. php发送post请求的三种方法示例

    本文分享下php发送post请求的三种方法与示例代码,分别使用curl.file_get_content.fsocket来实现post提交数据,大家做个参考. php发送post请求的三种方法,分别使 ...

  10. 转 Velocity中加载vm文件的三种方式

    Velocity中加载vm文件的三种方式   velocitypropertiespath Velocity中加载vm文件的三种方式:    方式一:加载classpath目录下的vm文件 Prope ...

随机推荐

  1. Go单元测试与报告

    1.编写代码 1)打卡GoLand,新建项目命名为gotest 2)在gotest目录下新建两个go file,如下图所示: 其中CircleArea.go为计算圆面积的待测go程序,代码如下: pa ...

  2. Sa-Token v1.42.0 发布 🚀,新增 API Key、TOTP 验证码、RefreshToken 反查等能力

    Sa-Token 是一款 免费.开源 的轻量级 Java 权限认证框架,主要解决:登录认证.权限认证.单点登录.OAuth2.0.微服务网关鉴权 等一系列权限相关问题. 目前最新版本 v1.42.0 ...

  3. ReentrantLock底层源码分析

    一.简单使用 在聊它的源码之前,我们先来做个简单的使用说明.当我在IDEA中创建了一个简单的Demo之后,它会给出以下提示 提示文字 在使用阻塞等待获取锁的方式中,必须在try代码块之外,并且在加锁方 ...

  4. jmeter参数化CSV文件内容为中文读取乱码的问题

    如下图,若CSV文件内的参数为中文时候,jmeter在读取数据时会显示为乱码且不可用 这里与创建CSV参数文件的编码格式有关系 系统自带的编码方式只有红圈内几项,只有编码格式为GBK时,才支持读取中文 ...

  5. 为了掌握设计模式,开发了一款Markdown 文本编辑器软件(已开源)

    设计模式实战项目:Markdown 文本编辑器软件开发(已开源) 一.项目简介 项目名称:YtyMark-java 本项目是一款基于 Java 语言 和 JavaFX 图形界面框架 开发的 Markd ...

  6. 聊聊AI浏览器

    提供AI咨询+AI项目陪跑服务,有需要回复1 大模型一直有个难以解决的问题:系统的知识是过时的,他们难以跟进最新的信息. 基于这个原因,ChatGPT以及DeepSeek都提出了联网功能,只不过效果嘛 ...

  7. Spring JdbcTemplate操作数据库

    Spring JdbcTemplate操作数据库 源码 代码测试 pom.xml <?xml version="1.0" encoding="UTF-8" ...

  8. XXL-JOB v3.0.0 | 分布式任务调度平台

    Release Notes 1.[升级]调度中心升级至 SpringBoot3 + JDK17: 2.[升级]Docker镜像升级,镜像构建基于JDK17: 3.[优化]IP获取逻辑优化,优先遍历网卡 ...

  9. 用JavaScript打造全新编程语言:从无到有的完整实践指南

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  10. WebAssembly在实际应用中的案例探究

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...