由于之前接到一个项目,是对接的第三方厂商的开放接口,导致他们不愿意修改表单接口,我这边只好通过一个接口获取到所有数据,然后遍历获取每条数据的某个字段来进行第二条接口以此类推,导致了一时间并发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)
})
文章讲述了作者在项目中遇到的问题,需通过接口获取大量数据并处理,通过数据分块和Promise.all优化并发,避免了浏览器和后端服务器过载。提到的关键技巧包括全局变量管理和异步操作的顺序控制。
291

被折叠的 条评论
为什么被折叠?



