队列,在顺序处理大量任务的时候是非常有用的。本文介绍如何在Js中设计简单的队列处理。
设想一个情景:你需要从网络上获取数量不定的搜索内容。与此同时,你需要对返回的JSON对象进行解析,并且使用你解析完毕的数据发起一个新的请求。但是注意,我们增加一个【网络请求限制】,即你发起新请求的目标主机有访问限制,不能过于快速地发起请求。
我们如何设计这个程序呢?
用ajax异步操作+callback回调,这么写固然没什么错,但是异步操作本身执行的时序就比较复杂,我们倾向于获取内容单独写一个或一组方法,处理或发起新请求再单独写方法,且用Interval定时执行。
下面用伪代码构思一下:
var List = new Array();//这里定义一个数组类,我们作为队列使用
function GetSearchContent(){//获取搜索的内容
while(/*...*/) {
//...
List.push(data);//push方法把获取到的data推进队列尾部,这样获取内容就完全独立出来了。
return;
}
}
function ProcessList(){//处理列表
if(List.length < 1){//在数组长度小于1的时候不执行
return;
}
var temp = List.shift();//shift方法会返回数组的第一个对象并且删除它,会更改数组长度,有利于我们逐项处理数组对象
//....JSON处理略过
//....网络请求略过
return;
}
setInterval(ProcessList(),3000);//待避定时循环
从上方的例子我们可以发现,处理和获取内容的方法互相独立,互不干涉,它们唯一的联系就是队列。一个在队列尾部追加内容,一个在队列头部删除内容,直到队列处理完毕。
可能这个写法的效率并不及回调,但是这么写的思路远比回调清晰得多,无需考虑各种复杂情况。