使用队列控制多个请求访问一个异步方法

  以前在项目进入测试阶段的时候,测试部给发了一个bug,大体是在搜索的时候搜索出来的东西和实际的不符合。ajax

  因而我去翻代码,原来问题是搜索的时候每次键盘按下都会进行一次搜索,可是搜索时间是异步的,这就致使了上一次搜索还没结束下一次搜索就有开始了。代码的执行就想是一锅粥,乱成一团。搜索的结果天然是不可能准确的了。数组

  事实上,异步代码一旦调用频繁后,要么回调满地图跑,要么这些代码不要求有前后,规律。我见过一些代码,全部的请求都用异步,有时候两三个方法同时请求一个方法的时候,就会出现变量赋值错误,代码执行混乱等问题。。。。话题扯远了,回到搜索的问题,若是要处理这种问题该怎么办呢?我一直思考,都没有想出什么好办法。异步

  这时候就体现出了,经验与知识的重要性。我遍寻无果后,便去问了同事和经理,通过他们的指导,算是有了一些头绪。学习

  使用队列来控制搜索的次数与条件。测试

  

            //队列
            Queue:function(){
                var arr = [];
                //入队
                this.push = function (item) {
                    arr.push(item);
                    return true;
                };
                //出队
                this.shift = function () {
                    return arr.shift();
                };
                //获取队首
                this.getHead = function () {
                    return arr[0];
                };
                //获取队尾
                this.getTail = function () {
                    return arr[arr.length - 1];
                };
                //删除数组固定位
                this.splice = function (start,end) {
                    arr.splice(start, end);
                };
                //清空数组
                this.clear = function () {
                     arr=[];
                };
                //获取数组长度
                this.getLength = function () {
                    return arr.length;
                };
            }

  搜索的时候,按钮第一次被按下时,将搜索条件push到队列里,并调用搜索方法。非第一次直接就push到队列里。this

  搜索方法执行时,先取队尾的搜索条件,校验,将搜索条件附加到参数中。在成功返回的回调中获取当前队列的长度,若是队列长度大于1,删除除了队尾的其他搜索条件,并递归执行搜索方法,不然就清空队列。每次执行都会只剩下队尾的一个或空,直到没有再按下搜索条件,递归才会终止。spa

     var queue=new Queue();
     //搜索点击
     function onSearchClick(key){         
         if(queue.getLength==0){
            queue.push(key);
            search()
         }else{
            queue.push(key); 
         }
     }
     //搜索
     function search(){
         //获取队尾
         var key=queue.getTail();
         if(!key){
             $.ajax({
                ....
                data:{searchKey:key},//赋值搜索条件
                ....
                success:function(result){
                    var length=queue.getLength();
                    if(length>1){
                        //清空除队尾的其他条件
                        queue.splice(0,length);
                        //递归调用
                        search();
                    }else{
                        //清空队列
                        queue.clear();
                    }                    
                },             
            })
         }
     }
     
    //队列
    Queue:function(){
        var arr = [];
        //入队
        this.push = function (item) {
            arr.push(item);
            return true;
        };
        //出队
        this.shift = function () {
            return arr.shift();
        };
        //获取队首
        this.getHead = function () {
            return arr[0];
        };
        //获取队尾
        this.getTail = function () {
            return arr[arr.length - 1];
        };
        //删除数组固定位
        this.splice = function (start,end) {
            arr.splice(start, end);
        };
        //清空数组
        this.clear = function () {
            arr=[];
        };
        //获取数组长度
        this.getLength = function () {
            return arr.length;
        };
    }

  如上完整的控制搜索代码,在这里还得说最开始个人思路是有的,可是代码写的很糟糕,基本没有层次,逻辑也是处处乱串。原本我觉得能实现功能就是最好,直到一个经验比较丰富的同事作了相似的功能,我撒了一眼,果真我仍是太菜了。因而参照同事的代码结构结合本身的思路重构了一下,感受比以前的好多了。code

  这个事件让我意识到本身仍是积累知识,积累经验的时段。仍是须要不断学习,咱们所处如逆水行舟,不进则退。blog

  若是有什么写的不对,或是改进的地方还望不吝赐教。递归

相关文章
相关标签/搜索