javascript实现批次处理请求的数据
- 考虑一个需要对ajax请求进行处理的response函数
- 1.ajax("url1",response)
- 2.ajax("url2",response)
代码实现如下:
var res = [];
//将两次ajax请求的数据处理后放入res中
function response (data) {
res = res.concat(
data.map((val) => {
return val*2
})
)
}
ajax("url1",response)
ajax("url2",response)
缺点:
如果url1的数据特别多,有1000万条的话,url1请求的回调response函数的处理时间特别长,需要等待较长时间再去处理url2返回的数据。
需求: 创建一个不会霸占事件循环队列的并发系统,可以异步的批处理这些数据,处理完后返回事件循环,让其他事件有机会进入
var res = [];
function response (data){
var chunk = data.splice(0,1000);
//对1000条数据进行处理
res = res.concat(
chunk.map((val) => {
return val*2
})
);
if(data.length > 0){
//将下一个批次的chunk数据进行异步调度,setTimeout(()=>{},0)会等待机会插入事件循环
setTimeout(() => {
response(data)
},0)
}
}
不足:
- 1.并没有协调这些批次任务的顺序,而是每次处理完1000条数据后,通过setTimeout将下一个批次的处理插入当前时间循环队列的结尾处(并不准确的描述,详细查看js事件循环)。待补充,如何按一定顺序批次处理。 (参考小黄书笔记)