由于之前接到一个项目,是对接的第三方厂商的开放接口,导致他们不愿意修改表单接口,我这边只好通过一个接口获取到所有数据,然后遍历获取每条数据的某个字段来进行第二条接口以此类推,导致了一时间并发2000多条接口,浏览器和他们的后端服务器超出负荷。
首先我们分块,把第一个接口获取到的2000多条数据分成十份200个的,在进行promise.all
let chunks = []
for (let i = 0; i < data.length; i += 200) {
chunks.push(data.slice(i, i + 200))
}
然后在进行循环函数sequence(),每次promise.all两百条数据,接口成功再次循环。
这里要避开两个坑,一个要在全局创造一个变量,来把获取到的推进去,如果放在函数内部,每次都会清空,另一个要把promiseall的接口先推到一个数组里面一起执行,不然会有问题
let tasks = []
function sequence(arr, start) {
let taskOperatorsList = []
let hash = {}
let promiseChunks = []
if (start >= arr.length) {
setTableDate(tasks)
return tasks
}
arr?.[start].map((item) => {
promiseChunks.push(getTask(item?.projectCode))
})
Promise.all(promiseChunks)
.then((reses) => {
sequence(arr, start + 1)
}) .catch((error) => {
sequence(arr, start + 1)
})