通过定时器发送ajax请求,降低并发的解决方式记录
程序员文章站
2022-03-09 19:11:26
...
原先是for循环发送ajax请求导致并发过高的问题 ,先采用定时器的方式,定时发送ajax请求。以便降低并发。
//生成ajaxPromise对象
async function createAjaxPromise(newTempData) {
//console.log(newTempData.length); //5
var Index = 0;
//下标值0-length-1
//用来存放promise对象的数组
var timer = null;
let p_arr = await new Promise((resolve,reject) => {
var p_arr1 = [];
timer = setInterval(() => {
console.log(Index);
if (Index > newTempData.length - 1) {
//超过索引,清除定时器
// console.log(1)
clearInterval(timer)
// console.log(p_arr1)
resolve(p_arr1);
} else {
//console.log(2)
// console.log(newTempData[Index++]);
//临时索引
var tempIndex = Index++;
console.log(tempIndex);
// console.log(getSomeData(newTempData[tempIndex].length, newTempData[tempIndex]));
p_arr1.push(getSomeData(newTempData[tempIndex].length, newTempData[tempIndex]));
}
// console.log(newTempData.length); //5
// console.log(getSomeData(newTempData[Index++].length, newTempData[Index++]));
}, 1000)
})
return p_arr;
// Index++;
// console.log(Index);
//for (let i = 0; i < newTempData.length; i++) {
//console.log(newTempData[i])
//console.log(i);
//if (i > newTempData.length) return;
//timingLoading(p_arr, newTempData, i);
//console.log(getSomeData(newTempData[i].length, newTempData[i]));
// p_arr.push(getSomeData(newTempData[i].length, newTempData[i]))
//}
//console.log(p_arr);
}
由于发送的ajax的请求是嵌套的,只能用promise来保证拿到结果集不会有问题。
//获取指定数量的结果集
async function getSomeData(totalNum, v) {
let index = 0;
let t_arr = [];
return new Promise((resolve, reject) => {
//设置定时器
var timer = setTimeout(function (res) {
for (i = 0; i < totalNum; i++) {
getAddressAjax(v[i][0], v[i][1], v[i][2]).then(function (temp_arr) {
//用坐标集合逆编码获取结构化地址
getCoordinateAjax(temp_arr).then(function (res) {
// console.log(res);
// t_arr.push(res);
t_arr.push(res);
if (totalNum - 1 == index) {
//console.log(1)
//重置索引 保证ajax返回的结果有序
resolve(t_arr);
}
// console.log(index)
index++;
})
})
}
}, totalNum*30)
})
}
//调用,获取promise对象集合
p_arr = await createAjaxPromise(newTempData);
console.log(p_arr)