场景:需求批量选中列表中的那条数进行处理,这种问题可能后端服务帮我们处理好了,我们只需传入约定好的数据集,例如:ids=['123','456'....],但是如果后端不支持批量处理,可能就需要前端的来处理。
处理思路,首先想到采用promise.all
1.promise.all处理多个异步调用
function ajax() {
let data = [{ name: '红红', age: 2 }, { name: '张张', age: 8 }]
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(data)
}, 200)
})
}
创建Promise方法
function createPromise() {
let promise = new Promise((resolve, reject) => {
//将业务接口的返回值,resolve进去
ajax().then((res) => {
resolve(res)
})
})
return promise
}
function runBatch() {
let userList = [{ id: 1 }, { id: 2 }];
let list = [];
let resList = [];
userList.forEach((item) => {
list.push(createPromise())
})
Promise.all(list).then((res) => {
resList = res
})
}
runBatch()
但是写完发现,无法实现我的需求,我的需求是当用户处理完所有数据后,再对处理结果,进行反馈,找出没有处理成功的,展示出来。然后promise.all在处理异步请求的时候,如果有一个接口异常就不会继续执行,会阻塞。Promise.all得等所有请求响应,等所有请求成功,响应时间太长问题。所以这时候我需要采用别的方式处理,我想到了递归。
2.采用递归处理多个异步调用
// 批量处理数据 demo
function ajax() {
let data = [{ name: '红红', age: 2 }, { name: '张张', age: 8 }]
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(data)
}, 200)
})
}
递归终止条件,数组长度小于等于1
async function runBatch(length, arr) {
const res = await ajax();
arr.push(res)
if (length> 1) {
await runBatch(length- 1, arr) // 可以保证每一条数据都能执行
}
return arr
}
async function getResult() {
let userList = [{ id: 1 }, { id: 2 }];
let resList = await runBatch(userList.length, []);
}
getResult()
....
然后通过分析resList,来展示批处理数据后的结果