前端业务中完整的JS轮询思路分享(含源码)

2024-08-27 12:28

本文主要是介绍前端业务中完整的JS轮询思路分享(含源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

在我们开发的业务中,有时候不可避免的需要调用一些接口去轮询结果。(原因就是:比如说,我们借助第三方执行下单操作,但是我们需要知道下单后的状态,才能继续我们的下一步流程。因为第三方属于异步,所以不可能迅速获取到下单的状态,这个时候我们就需要轮询,一直到第三方返回具体的成功或者失败结果为止)。

技术栈:

vue3 + js + element plus

开发场景:

本文笔者将根据公司业务里真实的案例进行分析分享。

在调用下单操作的接口后,我们需要再调用轮询接口,去查询下单结果,如果下单成功,那么跳转进入收银台页面,如果失败,抛异常,提醒用户具体失败原因。

状态枚举:

1:结果查询中,未返回              2:下单成功         3:下单失败

轮询思路:

1.因第三方接口属于异步,所以具体返回结果时间不一定,这个时候就需要我们反复调用轮询接口,直到返回具体结果。

2.反复调用接口,要么使用定时器,要么使用递归。因定时器需要设置等待时间,但是具体写入等候时间,并不是很好的选择,同时还要考虑清除定时器的时机。在这里笔者更倾向于递归搭配延时器去操作,当上一次调用返回结果,再去调用下一次接口。

3.调用轮询接口的时候,需要给用户loading提示,但是这里得考虑不能每一次轮询,都用新的loading,否则就会页面一直闪烁,对于用户体验来说,是非常差的。笔者的思路是,针对轮询接口关闭请求拦截器里的loading,然后针对于轮询接口单独写入一个loading,然后轮询开始到轮询结束只用一个loading。

4.得考虑非正常情况下的失败情况,比如500的状态,不能让loading还在那里展示,当异常状态下使用try catch捕获,然后关闭loading,给出提示。

5.轮询次数不能无限制,假设第三方出问题了,一直不返回成功或者失败的状态。我们不可能一直调用接口,一直让页面loading加载。更不能期望于用户去大刷浏览器停止轮询操作。这个时候我们得设置具体的轮询次数,当到达指定的次数,还未获取到正确的结果,则中断轮询,提醒用户下单失败。

具体代码:

let queryLoading = null;
const queryDone = () => {queryLoading.close();queryNum = 0;
};
let queryNum = 0;
// 轮询下单结果
const queryResult = async (batchNo) => {queryNum++;if (queryNum > 30) {ElMessage.error("下单失败");queryDone();return;}queryLoading ??(queryLoading = ElLoading.service({lock: true,target: document.getElementsByClassName("router-view")[0],text: "拼命加载中",}));try {// 调用轮询订单状态接口const queyRes = await queryChannelApplyCreateOrderResult({batchNo,bizType: params.value.bizType,});if (queyRes.data.handlerResult == 2) {queryDone();//跳转收银台页面router.push({path: "/goods-order/goods-payment",query: { benefitOrderCode: JSON.stringify([queyRes.data.pcsOrderId]) },});} else if (queyRes.data.handlerResult == 3) {queryDone();ElMessage.error(queyRes.data.failReason);return;} else {setTimeout(() => {queryResult(batchNo);}, 500);}} catch (error) {queryDone();}
};

tips:采用空合并运算符?? ,是为了能多次轮询只共用一个loading,优化用户体验感

这篇关于前端业务中完整的JS轮询思路分享(含源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111668

相关文章

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Python虚拟环境与Conda使用指南分享

《Python虚拟环境与Conda使用指南分享》:本文主要介绍Python虚拟环境与Conda使用指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python 虚拟环境概述1.1 什么是虚拟环境1.2 为什么需要虚拟环境二、Python 内置的虚拟环境工具

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

html 滚动条滚动过快会留下边框线的解决方案

《html滚动条滚动过快会留下边框线的解决方案》:本文主要介绍了html滚动条滚动过快会留下边框线的解决方案,解决方法很简单,详细内容请阅读本文,希望能对你有所帮助... 滚动条滚动过快时,会留下边框线但其实大部分时候是这样的,没有多出边框线的滚动条滚动过快时留下边框线的问题通常与滚动条样式和滚动行

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”