更新记录

1.0.0(2026-07-21)

新增

  • 首次发布,提供轮询能力
  • 支持 intervalimmediatemaxRetries 配置项
  • 支持 startstoppauseresume 控制器方法
  • 支持 onDataonErroronStop 回调
  • 调用 poll() 后自动启动轮询
  • 支持 stop() 后通过 start() 重新启动
  • 支持 pause() / resume() 临时暂停/恢复
  • 失败次数连续计数,成功一次即重置
  • 完整的 TypeScript 类型定义

平台兼容性

uni-app(3.8.0)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟

uni-app x(3.8.0)

Chrome Safari Android iOS 鸿蒙 微信小程序

mh-request-polling

mh-request 提供轮询能力的插件,支持自动按间隔请求、启停控制、暂停/恢复、错误重试限制。

本插件是 mh-request 的配套插件,需配合使用。

特性

  • 🔁 自动轮询:按指定间隔自动发起请求,无需手动循环
  • 🎮 灵活控制:提供 start / stop / pause / resume 方法,随时操控轮询任务
  • 🛡️ 错误容错:支持最大连续失败次数,超限自动停止,避免无效请求
  • 📦 零侵入:在 mh-request 实例上挂载 poll 方法,不影响原有请求

快速开始

import { Request } from '@/uni_modules/mh-request'
import { pollPlugin } from '@/uni_modules/mh-request-polling'

const request = new Request({
  baseURL: 'https://api.example.com',
  plugins: [
    {
      plugin: pollPlugin
      // 轮询插件无需额外配置
    }
  ]
})

// 开始轮询,每 3 秒获取一次订单状态
const poller = request.poll('/order/status', { data: { id: 123 } }, {
  interval: 3000,
  onData: (data) => {
    console.log('订单状态:', data.status)
  },
  onError: (err) => {
    console.warn('轮询出错:', err)
  }
})

配置项

PollConfig

属性 类型 必填 默认值 说明
interval number 3000 轮询间隔(毫秒)
immediate boolean true 是否立即执行第一次请求
maxRetries number 0 最大连续失败次数,0 表示不限制
onData (data: any) => void - 每次请求成功时的回调
onError (err: any) => void - 每次请求失败时的回调
onStop (reason?: string) => void - 轮询停止时的回调(手动停止或达到最大重试)

Poller 控制器

request.poll() 返回一个控制器对象:

方法 说明
start() 启动轮询(停止后可重新启动)
stop(reason?: string) 停止轮询,不可恢复
pause() 暂停轮询,可恢复
resume() 恢复轮询

工作原理

轮询流程

调用 poll() → 自动启动 → 发起请求
                    ↓
              请求成功 → 触发 onData → 等待 interval → 发起下一次请求
                    ↓
              请求失败 → 触发 onError → 失败计数 +1
                    ↓
              达到 maxRetries → 自动停止,触发 onStop
                    ↓
              未达上限 → 等待 interval → 继续重试

状态说明

状态 说明
running 运行中,按间隔持续发起请求
paused 暂停中,暂停发起请求,可恢复
stopped 已停止,彻底结束,调用 start() 可重新开始

高级用法

条件停止轮询

onData 回调中根据业务逻辑主动停止:

const poller = request.poll('/task/status', {}, {
  onData: (data) => {
    if (data.status === 'completed') {
      poller.stop('任务已完成')
    }
  }
})

错误重试限制

连续失败 3 次后自动停止轮询:

request.poll('/unstable-api', {}, {
  maxRetries: 3,
  onError: (err) => console.warn('请求失败,剩余重试次数:'),
  onStop: (reason) => console.log('轮询已停止:', reason)
})

延迟启动

不立即执行第一次请求,等待一个间隔后再发起:

request.poll('/api/data', {}, {
  interval: 5000,
  immediate: false   // 5 秒后执行第一次请求
})

手动控制轮询

const poller = request.poll('/api/updates', {}, { interval: 2000 })

// 页面不可见时暂停(uni-app 页面生命周期)
onHide(() => poller.pause())

// 页面可见时恢复
onShow(() => poller.resume())

注意事项

连续失败计数

maxRetries 统计的是连续失败次数,只要有一次成功即重置为 0。这意味着偶尔的网络抖动不会导致轮询停止,只有持续不可恢复的失败才会触发停止。

请求方法默认 GET

options 中的 method 默认为 GET,如需 POST 请求:

request.poll('/api/submit', {
  method: 'POST',
  data: { name: 'test' }
}, {
  interval: 5000
})

避免无限轮询

maxRetries: 0(默认)时,轮询不会因失败而停止,会无限重试。建议根据业务场景设置合理的 maxRetries,或在 onData 中通过条件调用 stop()

停止后重新启动

stop() 是彻底终止,调用后轮询任务结束。如需重新开始,调用 start() 即可:

poller.stop()
// 稍后重新启动
poller.start()

pause() / resume() 用于临时暂停/恢复,保留当前状态(如失败计数),适合页面切后台等场景。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。