日期:2014-05-16 浏览次数:20444 次
上一篇文章(http://blog.csdn.net/scorpio3k/article/details/7875895)中提到在Ex tJs中使用递归处理批量发送异步请求同步化的问题,但后来被指点javascript的递归会存在严重的性能问题,是javascript对递归的实现不好,但java中的递归的思路应该是没有问题的。
对于javascript,原本的思路是这样的:
batchProcess: function(index, length, params){ if(index >= length){ alert('处理结束'); return; }else{ Ext.Ajax.request({ url:this.url, params:params[index], method:'POST', success:function(response) { batchProcess(++index, length, params); }, scope:this }); } }
需要对上面的实现进行调整,同时又要满足如下两个条件:
1. 使用异步发送请求;
2. 需要保持多个请求的次序,即前面的请求处理结束后才能执行后面的请求
首先不能使用while(isOk)循环,因为while(isOk)性能太差,会进行非常非常非常多的循环,浏览器就死掉了。
可以使用javascript原生的setInterval方法,模拟while(isOk)循环:
function syncFor(index, length, params){ var isCanDo = true; setInterval(function(){ if(index >= length){ clearInterval(); return; }else if(isCanDo){ Ext.Ajax.request({ url:this.url, params:params[index], method:'POST', callback:function(options, success, response) { if(success){ ++index; isCanDo = true; }else{ clearInterval(); return; } }, scope:this }); isCanDo = false; } }, 100); }
使用如下方法,性能应该和for循环差不多,同时实现了递归逻辑、批量异步请求同步的问题,因此对于javascript,上面的实现是很好的方式。