前言
这段时间在做一个平台,大约数据库里面有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 请求异常");
}
})
}