【轮询】【ajax】【js】【spring boot】ajax超时请求:前端轮询处理超时请求解决方案 + spring boot服务设置接口超时时间的设置
场景描述:
ajax设置timeout在本机测试有效,但是在生产环境等外网环境无效的问题
1.ajax的timeout属性设置 前端请求超时事件【网络连接不稳定时候,就无效了】
var data = JSON字符串;
$.ajax({
type: "POST",
url: url,
dataType: 'json',
timeout: 3000,//3s钟超时
data: data,
xhrFields: {
withCredentials: true
},
success: function (json) {
alert("保存成功")
},
error: function (err, textStatus, errorThrown) {
alert("保存失败")
}
});
属性说明:
timeout: //单位是毫秒值 timeout: 0 //代表永不超时
其他说明:
当然,ajax里面设置的是前端超时事件,后端服务 的接口 也有超时时间。
声明: timeout属性设置的超时时间,肯定是有效果的。
但是 在生产环境等时候,因为网络跳动不稳定,导致 前后端连接中断了,即使这里的超时时间设置再大 或者设置永不超时,也会进入error,即会发生超时情况。这种时候,就需要 在前端使用轮询去解决这种问题了。
2.spring boot为例,设置接口超时时间的两种方式
1> 在配置文件application.properties中加了spring.mvc.async.request-timeout=20000,意思是设置超时时间为20000ms即20s,
2>还有一种就是在config配置类中加入
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void configureAsyncSupport(final AsyncSupportConfigurer configurer) {
configurer.setDefaultTimeout(20000);
configurer.registerCallableInterceptors(timeoutInterceptor());
}
@Bean
public TimeoutCallableProcessingInterceptor timeoutInterceptor() {
return new TimeoutCallableProcessingInterceptor();
}
}
3.前端轮询方案 ,查询后端的保存状态,直到查询到后端的保存状态为成功,才做相应的用户响应操作 【解决ajax设置timeout避免不了的网络不稳定的问题】
轮询方案简介:
这里就要对 1中的 ajax进行改造了 。
这里使用 js的 setInterval()发起轮询 clearInterval()停止轮询 setInterval(code,millisec) 参数 描述
code 必需。要调用的函数或要执行的代码串。
millisec 必须。周期性执行或调用 code 之间的时间间隔,以毫秒计。 setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。
setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。
轮询方案代码:
var data = JSON字符串;
var myFlag = new Date().getTime(); //作为本次保存的 唯一标识
data.myFlag = myFlag; //作为后端入参传给后台
$.ajax({
type: "POST",
url: url,
dataType: 'json',
timeout: 0,//永不超时
data: data,
xhrFields: {
withCredentials: true
},
success: function (json) {
alert("处理成功的逻辑 依旧写在这里");
},
error: function (err, textStatus, errorThrown) { //此处要判断 error时候,是不是因为超时导致的,如果是超时导致的error,那就做轮询
if (textStatus == 408 || textStatus == 'timeout') {
//轮询查询批量保存状态
window.myFlag2222 = setInterval(function (){
this.batchSaveTimer(myFlag);
},6000);
}else {
loading.hide();
$('.J_button_submit').prop('disabled', false);
tips.show("保存失败");
}
}
}); batchSaveTimer: function (flag) { $.ajax({
type:'get',
url: url + "/" + flag,
dataType:'json',
cache:true,
xhrFields: {
withCredentials: true
},
success:function(result) {
if (result.code && result.code == 'success' ) { //当后端保存状态为1 代表保存成功
if (result.data == '1') { //这里就 停止轮询 入参一定是 发起轮询的setInterval()方法的返回值
clearInterval(window.myFlag2222); alert("这里同样写一份 处理成功的逻辑"); //当后端保存状态为-1 代表保存失败
} else if (result.data == '-1') { //这里视业务而定,是否停止轮询
clearInterval(window.myFlag2222); alert("这里写一份 处理失败的逻辑");
}
}
},
error:function() {
alert("服务器异常")
}
}); },
附录说明:
当然,后端处理也很简单,在redis记录一个 status.
myFlag作为key
status作为value 开始保存,把status设置为0 开始处理
status设置为1 处理成功
status设置为-1 处理失败
【轮询】【ajax】【js】【spring boot】ajax超时请求:前端轮询处理超时请求解决方案 + spring boot服务设置接口超时时间的设置的更多相关文章
- springboot设置接口超时
springboot 设置接口超时 1.配置文件 application.properties中加了,意思是设置超时时间为20000ms即20s, spring.mvc.async.request-t ...
- 图片轮播的JS写法,通用涉及多个轮播
本代码是借鉴大神的代码分析理解后,自己改写的!有不足指出希望给为大神指点. 核心只有一个JS,里面包含了css样式. 展示效果图:
- 框架基础:ajax设计方案(六)--- 全局配置、请求格式拓展和优化、请求二进制类型、浏览器错误搜集以及npm打包发布
距离上一次博客大概好多好多时间了,感觉再不搞点东西出来,感觉就废了的感觉.这段时间回老家学习驾照,修养,然后7月底来上海求职(面了4家,拿了3家office),然后入职同程旅游,项目赶进度等等一系列的 ...
- 前端通信:ajax设计方案(六)--- 全局配置、请求格式拓展和优化、请求二进制类型、浏览器错误搜集以及npm打包发布
距离上一次博客大概好多好多时间了,感觉再不搞点东西出来,感觉就废了的感觉.这段时间回老家学习驾照,修养,然后7月底来上海求职(面了4家,拿了3家office),然后入职同程旅游,项目赶进度等等一系列的 ...
- 玩转spring boot——ajax跨域
前言 java语言在多数时,会作为一个后端语言,为前端的php,node.js等提供API接口.前端通过ajax请求去调用java的API服务.今天以node.js为例,介绍两种跨域方式:Cross ...
- 同步 异步 AJAX JS
jQuery:$post.$get.$ajax与php,实现异步加载 什么是异步加载? 整个最通俗的说法就是将另外一个页面上的数据通过append() 或者 html()等函数插入到本页上.纯js写法 ...
- 使用spin.js优化等待ajax返回时的页面效果
[本文出自天外归云的博客园] 最近在做一个JIRA信息统计的系统,在统计JIRA关联信息的过程中由于需要等待ajax返回结果到前端,时间较长,所以要添加一段等待时的loading画面,使用spin.j ...
- spring mvc ajax 400解决
The request sent by the client was syntactically incorrect. ajax发起请求时报400错误.请求代码如下: var reportId=($( ...
- zepto源码研究 - ajax.js($.ajax具体流程分析)
简要:$.ajax是zepto发送请求的核心方法,$.get,$.post,$.jsonp都是封装了$.ajax方法.$.ajax将jsonp与异步请求的代码格式统一起来,内部主要是先处理url,数据 ...
随机推荐
- 对于一个由0..n的所有数按升序组成的序列,我们要进行一些筛选,每次我们取当前所有数字中从小到大的第奇数位个的数,并将其丢弃。重复这一过程直到最后剩下一个数。请求出最后剩下的数字。
输入描述: 每组数据一行一个数字,为题目中的n(n小于等于1000). 输出描述: 一行输出最后剩下的数字.我的思路是用两个链表,一个用于存储原数据,一个用于存储要丢掉的数据,再循环从元数据中剔除掉即 ...
- CSS常用属性之选择器
css选择器 序号 选择器 例子 例子描述 1 .class .intro 选择class="intro"的所有元素 2 #id #firstname 选择id="fir ...
- 【翻译】.NET 5 Preview2发布
在4月2日,发布了.NET 5.0 Preview2,这次发布对一些功能和性能做了相关的改进,同时后面也会实施5.0版本更多的功能,其中一些功能目前也dotnet/designs在.NET 5 Pre ...
- 在C#MVC三层项目中如何使用SprintNet
0.添加dll文件 1.首先在根目录下新建一个文件夹[Config],然后新建2两个xml文件. 1-1[controllers.xml]用来配置需要创建的对象 1-2[service.xml]用来配 ...
- [vijos1234]口袋的天空<最小生成树>
题目链接:https://vijos.org/p/1234 白天刚刚写完prim的算法,晚上就心血来潮的打了一道最小生成树的题 虽然有题解说可以用prim做,但是这道题明显是加最小的边,感觉krusk ...
- 用c#求一元二次方程
题目:编一个程序,输入a .b.c 的值,求出一元二次方程a*x*x+b*x+c=0的二个实数根. 我的思路: 我们都知道数学中求一元二次方程有很多方法:直接开方法.配方法.公式法.分解因式法等等,在 ...
- python fabric 练习记录
https://blog.csdn.net/freeking101/article/details/81103945 fabric 域名
- 在线诊断工具arthas (windows)
介绍: arthas是阿里巴巴开发的一款开源的,Java应用程序排查问题的非常好用的工具 当你遇到以下类似问题而束手无策时 arthas 可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各 ...
- 树形DP——动态规划与数据结构的结合,在树上做DP
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...
- mpvue小程序开发
查阅资料,看官方文档,知道mpvue是一个使用 Vue.js 开发小程序的前端框架(美团的开源项目).框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compi ...