前言
我们经常会遇到需要定时执行某些操作,特别是那些需要异步处理的操作。而useIntervalAsync
这个钩子函数就像是你的贴心小助手,帮助你轻松驾驭这些异步定时任务。
代码
封装成一个hooks
1 | TS复制代码import { onUnmounted, ref } from 'vue'; |
解析
一、了解useIntervalAsync
*\
useIntervalAsync
接收两个参数:一个回调函数和一个延迟时间。回调函数是你希望在每次定时器触发时执行的异步操作,而延迟时间则决定了这个操作执行的频率。
二、内部工作原理
- 引用变量:
useIntervalAsync
内部使用了Vue 3的ref
函数来创建响应式引用,包括timeout
(存储定时器的ID)、canceled
(表示定时器是否已取消)和cleanup
(存储清理函数)。 - 定时逻辑:在
run
函数中,首先检查canceled
的值,如果为true
,则直接返回,不再执行后续操作。然后,如果cleanup
中有函数,则执行它进行清理工作。接着,执行回调函数并等待其完成(或等待其返回的Promise完成),将返回的清理函数(如果有的话)赋值给cleanup
,并设置下一次定时器的触发时间。 - 初始化和刷新:在钩子函数被调用时,会立即执行一次
run
函数来初始化定时器。而flush
函数则用于刷新定时器,它会先清除当前的定时器(如果存在),然后重新执行run
函数来设置新的定时器。 - 取消和恢复:
cancel
函数用于取消定时器,并将canceled
设置为true
,同时执行cleanup
中的清理函数(如果有的话)。而recover
函数则用于恢复定时器,它将canceled
设置为false
,并调用flush
函数来刷新定时器。 - 组件卸载时的清理:通过
onUnmounted
钩子,确保在组件卸载时调用cancel
函数来取消定时器,避免内存泄漏。
三、使用与优势
使用useIntervalAsync
非常简单,只需传入回调函数和延迟时间即可。而且,由于它支持异步操作和清理函数,你可以更加灵活和高效地管理你的代码。无论是在数据获取、状态更新还是其他需要定时执行的异步操作中,useIntervalAsync
都能帮助你轻松应对。
想象一下,useIntervalAsync
就像一个训练有素的管家。你告诉它什么时候该做什么(回调函数和延迟时间),它就会准时为你完成任务。而且,它还很聪明,知道什么时候该出现(定时器触发时),什么时候该隐身(定时器取消时)。最重要的是,它还会帮你处理那些繁琐的清理工作,让你的代码保持整洁和高效
应用
场景:扫码登录
如我之前写的这篇文章:业务: 前后端实现二维码扫码登录-深度剖析
扫码登录应用场景与useIntervalAsync
的结合
扫码登录是许多应用(如微信、支付宝、QQ等)中常见的一种登录方式。用户通过扫描屏幕上的二维码,快速、便捷地完成登录过程。而useIntervalAsync
这个钩子函数,在这种场景下也可以发挥重要的作用。
扫码登录流程
- 生成二维码:用户在前端页面上触发扫码登录操作,后端生成一个唯一的二维码并返回给前端展示。
- 轮询检查登录状态:用户扫描二维码后,后端会验证二维码并等待用户的确认登录操作。此时,前端需要通过某种方式轮询检查登录状态。传统的轮询方式可能会使用
setInterval
,但这种方式不支持异步操作,并且不能很好地处理异步任务。而useIntervalAsync
则完美解决了这个问题。
useIntervalAsync
在扫码登录中的应用
- 异步检查登录状态:在
useIntervalAsync
的回调函数中,你可以发起一个异步请求到后端,检查用户是否已经扫描二维码并确认登录。这个异步请求可能是基于fetch
、axios
等库。 - 处理登录状态变化:一旦后端返回用户已经确认登录的信息,你可以在回调函数中处理这个状态变化,比如跳转到用户的主页或者显示登录成功的提示。
- 清理定时器:当用户成功登录后,你需要停止轮询操作。在
useIntervalAsync
中,你可以通过调用cancel
函数来清除定时器,确保不再发起不必要的请求。 - 优雅的错误处理:如果在轮询过程中发生错误,比如网络问题或者后端服务不可用,你可以在
useIntervalAsync
的回调函数中捕获这些错误,并给用户展示相应的提示信息
扫码登录应用场景与useIntervalAsync
的结合
扫码登录是许多应用(如微信、支付宝、QQ等)中常见的一种登录方式。用户通过扫描屏幕上的二维码,快速、便捷地完成登录过程。而useIntervalAsync
这个钩子函数,在这种场景下也可以发挥重要的作用。
扫码登录流程
useIntervalAsync
在扫码登录中的应用
- 异步检查登录状态:在
useIntervalAsync
的回调函数中,你可以发起一个异步请求到后端,检查用户是否已经扫描二维码并确认登录。这个异步请求可能是基于fetch
、axios
等库。 - 处理登录状态变化:一旦后端返回用户已经确认登录的信息,你可以在回调函数中处理这个状态变化,比如跳转到用户的主页或者显示登录成功的提示。
- 清理定时器:当用户成功登录后,你需要停止轮询操作。在
useIntervalAsync
中,你可以通过调用cancel
函数来清除定时器,确保不再发起不必要的请求。 - 优雅的错误处理:如果在轮询过程中发生错误,比如网络问题或者后端服务不可用,你可以在
useIntervalAsync
的回调函数中捕获这些错误,并给用户展示相应的提示信息
1 | ts复制代码import { ref, onUnmounted } from 'vue'; |
在这个例子中,checkLoginStatus函数是一个异步函数,它模拟了向后端发起请求检查用户是否已经扫码并确认登录的过程。这个函数被useIntervalAsync定时调用,每隔2秒执行一次。
当isLoggedIn变为true时,表示用户已经成功登录,此时轮询将停止。如果在轮询过程中发生错误,loginStatusError将被设置,并且可以根据业务逻辑选择是否停止轮询。
在Vue组件的setup函数中,我们通过onUnmounted钩子确保在组件卸载时取消轮询,以避免不必要的资源消耗和潜在的错误。
最后,我们将isLoggedIn、loginStatusError、cancel和flush暴露给模板,这样我们就可以在模板中显示登录状态,或者在需要时手动控制轮询的开始和结束。
本文转载自: 掘金