近期问题: jq循环中异步请求问题

时间:2022-07-23
本文章向大家介绍近期问题: jq循环中异步请求问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

问题1:

今天开发遇到了一个问题, 页面中的列表是通过循环ajax进行请求的,最后需要对请求结束的数据进行判断和统计,所以就存在异步问题,当然不用ES6, 一开始想的是用 async:false, 使用后发现,卡屏... 看到有个$.when(), 也不适用,不可能每个ajax都搞个变量... 请求代码如下:

nodeList.forEach(function(val) {
  $.ajax({
 ...
  })
})

解决: 由于知道列表的总数, 所以我就设置了个计数器,每进入一个ajax请求结束加一,最后判断到了列表总数一样的时候, 进行统计显示结果

问题2:

数组遍历ajax中,每次请求都会获取一个ip数组,例如

ip数组

需要对这些ip进行前端显示,以及计数,即不存在的ip就显示到表格里,存在的ip计数加一

解决: 先写好生成表格的函数 当然那个生成空表格的,也可以使用以下的方法

new Array(3).fill('<td>-</td><td>-</td>').join('')

但是, IE不兼容

Array.prototype.fill不兼容IE

    function createIpList(obj) {
        $('#ip-table-tbody').html('')
        var temp = 0
        var length = Object.keys(obj).length
        var blank = '' // 空表格
        if(length === 0) {
            blank += '<td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td>'
        }
        if(length % 3 > 0) {
            for (var i = 0;i < 3-length % 3 ; i++) {
                blank += '<td></td><td></td>'
            }
        }
        var tr = '<tr>'
        for ( v in obj ) {
            if(temp === 0) {
                tr += '<tr><td>'+ v + '</td>' +
                  '<td>' + obj[v] + '</td>'
            }
            else if(temp === 3) {
                temp = 0
                tr += '</tr><tr><td>'+ v + '</td>' +
                  '<td>' + obj[v] + '</td>'
            } else {
                tr += '<td>'+ v + '</td>' +
                  '<td>' + obj[v] + '</td>'
            }
            temp++
        }
        $('#ip-table-tbody').append(tr+blank)
    }

效果

随后,我们在遍历ajax中,将数组取出存入以ip为键,ip数量为值的对象中,然后将对象带入生成表格函数即可实时更新

// 这些都包裹在ajax的success中
... ... 
 ipList = []
 ipList = ipList.concat(ret.data.ips)
 ipList.forEach(function(val) {
    if(ipObj.hasOwnProperty(val)) { // 判断是否存在该ip, 如果存在就计数加一
       ipObj[val]++
    } else { // 不存在就创建键, 并初始化为1
      ipObj[val] = 1
    }
})
createIpList(ipObj)
... ...