For循环中进行Ajax请求

前言

这段时间在做一个平台,大约数据库里面有15亿左右的数据,为了优化数据库,进行了很多次的“水平分表”“设置索引”等操作。在有些功能上需要多表连查,但是由于数据库中表的内容都比较多,所以MySQL经常会崩溃或则后端崩溃。于是想到直接for循环进行数据库表中数据的遍历。

 

前端代码

代码是随便写的,大概就那意思

错误示范:


//循环5次,若其中有一次获取到值则跳出循环
for (let i = 0; i < 5; i++) {
	$.ajax({
		type: "POST",
		url: "./php/1.php",
		dataType: "json",
		data: {
			number: i
		},
		success: function(data) {
			if(data == false){
				console.log("未获取到数据...正在准备第二次循环");
			}else{
				console.log("获取到数据:"+data+"并停止循环");
				break;
			}
		},
		error: function() {
			Layer.msg("ajax 请求异常");
		}
	})
}

这个代码看上去没问题,但是由于for 循环是一个单线程的东西,而ajax是多线程的,之所以称之为异步同步,是因为执行到ajax的时候去后台开启了一个线程,但是for循环本身就是一个单线程的东西,那么执行到ajax的时候,ajax开启了一个线程,for循环是没有等他的,直到for循环结束的时候,才会把ajax返回的数据拿回来,所以会出问题。
但是这里我们把ajax的参数async改为false,会发现浏览器有警告提示并不支持这样操作

正确操作

我们应该使用递归来完成我们想要的效果


//运行自定义函数
query(1);
//自定义递归函数
function query(i) {
	$.ajax({
		type: "POST",
		url: "./php/1.php",
		dataType: "json",
		data: {
			number: i
		},
		success: function(data) {
			if (data == false) {
				console.log("未获取到数据...正在准备第二次循环");
				if(i<5){
					i++;
					query(i);
				}
			} else {
				console.log("获取到数据:" + data + "并停止循环");
			}
		},
		error: function() {
			Layer.msg("ajax 请求异常");
		}
	})
}

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注