我在许多年前写了一个ajax queue, 但是最近想再写一次,结果因为看了promise的代码,这次的实现居然跑偏了, Js的ajax这是个异步操作,它是不会阻塞正常的代码的,但是如果换成while的形式,这就会阻塞代码的执行了,卡顿说不上,但是会阻塞,仔细想了下,得出的结论是, js在ajax的回调那里其实已经分割成了两个处理机,一个是本地浏览器的正常js代码,另外一个是服务端回调的js的调用者, 它们两方其实不是一个东西了,就是后台何时返回所有的ajax请求都是不知道哪个快哪个慢的,但是快的回来的会执行对应的回调, 所以浏览器js这里只能写一个ajax的调用,而不应该用循环会阻塞, 如果仅仅有调用ajax的代码,那么这段代码它就马上执行过去了不会阻塞,所以要写一个不阻塞代码执行的ajax queue, 检查队列的时候也不能用循环,而只是正常的一次检查,然后,检查下一个的时候应该在ajax的回调里面再去检查,这样两个就能接力起来,不会阻塞代码的执行,这里可以用自己调用自己,形式类似于:
func queue(req){
queue.q=[]
if(req){q.push(req)}
if(q.len>0){
req=q.shift();
ajax(req,function(){
req.callback(),
queue();//再次shift下一个,然后, 重新发送ajax,这种形式应该不会阻塞,不停调用queue方法会不停向q中添加请求,最后会一个一个按次执行
})