前后端防重复提交(续)

前文介绍过前后端防重复提交的基本场景,简单的情况是只发起一个异步请求,如果有多个异步请求怎么操作呢?这个要分情况看下。

如果是后端服务器的接口支持一次传递多个申请,那么可以将任务放进数组中,发往后端。这是最好的方式,如果后端现在还不支持,最好说服改进下。

如果就是不支持的话,那么在前端做成并发异步任务,等待所有任务解禁再次提交按钮。

如果批量任务是发给不同的后端服务器处理,那么也是要在前端做成并发异步任务处理的。

这种情况下,使用Promise.allSettled是最好的方式了。

javascript 复制代码
function exectask(target){
	return new Promise((resolve,reject)=>{
		axios.post(url,{"target":target}).then(res => { 
			if (res.data.code!="200") reject(res.data.code)
			else resolve()
			}).catch(errp => reject(errp)) 
		});
}

Promise.allSettled(tasklist.map(item => exectask(item))).then((ret)=>{
	//console.log(ret) 
	$("#tasksubmit").attr("disabled",false);
	if (document.getElementById("taskul").getElementsByTagName("li").length==0) $("#taskseldiv").css("display","none"); 
	});

如果后端任务执行时间短,那么可以这样用,时间长的话,就不好这么用异步调用后.then里等结果出来执行后面的操作,而是直接执行,不用.then操作,不过要用定时器来定时查询后端处理状态。可以参考前面的文章《后台耗时任务的前后端协同方法》

如果后端限制单用户并发连接数的话或者就是想在前端限一下并发任务数的话,可以参考以下代码:

javascript 复制代码
(async () => {
	let ret = [];
	let executing = [];
	let tasksum=dealpool.length;
	for (let i=0;i<tasksum;i++) {
		let p = Promise.resolve().then(() => excetask(dealpool[i]));
		ret.push(p);
		if ( poolLimit<= tasksum) {
			let e = p.then(() => executing.splice(executing.indexOf(e), 1));
			executing.push(e);
			if (executing.length >= poolLimit) { await Promise.race(executing); }
			}
		}
	await Promise.allSettled(ret).then((res)=>{	
		//console.log(res) 
		$("#tasksubmit").attr("disabled",false);
		if (document.getElementById("taskul").getElementsByTagName("li").length==0) $("#taskseldiv").css("display","none"); 
		});
	})();
相关推荐
jktantan4 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
总要学点什么4 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
2601_962885725 小时前
quotes 字段全解:涨跌幅、振幅、换手率的口径与单位
java·前端·spring
excel5 小时前
encodeURI 和 encodeURIComponent 有什么区别?
前端
前端精髓5 小时前
调用openrouter的免费API模型
java·前端·javascript
赛博守夜人6 小时前
AI安全攻防与治理之十四:AI 安全测试不能脱离传统安全,Web、API、移动端与模型攻击面的组合拳
前端·人工智能·安全
开开心心_Every6 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
networknomad6 小时前
OpenReplay:自己搭的会话回放工具,给前端排错用的
前端·其他
缓慢更新7 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
陈随易7 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员