欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

通过定时器发送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)