javascript实现批次处理请求的数据

270 阅读1分钟

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事件循环)。待补充,如何按一定顺序批次处理。 (参考小黄书笔记)