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

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

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

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

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

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

  

            //队列
            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到队列里。

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

     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;
        };
    }

  如上完整的控制搜索代码,在这里还得说最开始我的思路是有的,但是代码写的很糟糕,基本没有层次,逻辑也是到处乱串。本来我以为能实现功能就是最好,直到一个经验比较丰富的同事做了类似的功能,我撒了一眼,果然我还是太菜了。于是参照同事的代码结构结合自己的思路重构了一下,感觉比之前的好多了。

  这个事件让我意识到自己还是积累知识,积累经验的时段。还是需要不断学习,我们所处如逆水行舟,不进则退。

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

时间: 2024-11-18 13:02:20

使用队列控制多个请求访问一个异步方法的相关文章

Shiro权限控制-区分Ajax请求

一.为什么要区分Ajax请求? 在前台使用EasyUI的系统中,所有的请求可以分为两大类: 1)跳转到页面 2)返回Json数据 这时当请求来了时要区分处理,如果是"跳转到页面"的请求,需要跳到没有权限的页面,否则"返回Json数据"的请求,需要返回一个Json数据{"success":false,"message":"权限不足!"} 二.实现原理分析 2.1 原有实现分析 原来权限执行分析: 1)当用户访

httpClient Post例子,Http 四种请求访问代码 HttpGet HttpPost HttpPut HttpDelete

httpclient post方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //----1. HttpPost request = new HttpPost(url); // 先封装一个 JSON 对象 JSONObject param = new JSONObject(); param.put("name", "rarnu"); param.put("password", "123456"

当我们访问一个网址后发生了什么?

问题:当我们访问一个网址后发生了什么?或者 描述一个http事物?1,输入网址(例如www.baidu.com2,解析域名(获得服务的ip地址3,建立连接(与后台建立通信之前与服务器的通信,TCP/IP协议三次握手:①打开客户端,客户端向服务器发出连接请求②服务器回应客户端的请求,并要求确认③客户 端回应服务器的确认,连接成功客4,发送5,断开连接(4次挥手的范式,把发送和接收关闭掉 HTTP OSI模型:物理层,数据层,网络层,传输层,会话层,表示层,应用层HTTP协议是一个应用层协议,由请求

面试常问问题:银行网上支付项目中怎么控制多线程高并发访问?

面试常问问题:银行网上支付项目中怎么控制多线程高并发访问? synchronized关键字主要解决多线程共享数据同步问题. ThreadLocal使用场合主要解决多线程中数据因并发产生不一致问题. ThreadLocal和Synchonized都用于解决多线程并发访问.但是ThreadLocal与synchronized有本质的区别: synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问.而ThreadLocal为每一个线程都提供了变量的副本,使 得每个线程在某一时

简单讲讲访问一个网页的过程

今天我想梳理访问一个网页发生的故事. 1.首先,访问一个网页,就要输入该网页的地址,就是域名(如www.baidu.com) 2.通过输入的域名,进行DNS解析(域名解析)从而找出网页的ip地址(如192.168.1.1) 3.浏览器与该服务器通过三次握手协议建立连接(tcp协议),这里可以通过本机缓存的cookies状态信息,保持上一次连接状态 (网上找的图) 4.浏览器给服务器发送HTTP请求内容(HTTP协议) (随意抓一个包当例子) 这里就是前端需要向后台请求数据发送的报文 5.服务器返

通过浏览器访问一个网站的背后到底经历了什

通过浏览器访问一个网站的背后到底经历了什么 HTTP-Principle-01 前言 来吧,随我一起来整理下HTTP与DNS协议吧,无论你是Dev or Ops这些都是你必须要知道的基础网络知识,如上图所示,我们把用户访问网站的流程大概分为了两大部分: DNS(用于解析域名的IP地址) HTTP(得到IP地址之后从服务器获取数据) 基于上面的两个点,就让我么来深刻的讨论下到底什么是DNS and HTTP把. What is DNS? 域名系统(Domain Name System,缩写:DNS

Http请求访问方式 GET PUT POST DELETE

public class HttpClientHelper {     public static final Logger logger = LoggerFactory             .getLogger(HttpClientHelper.class);     /**      * @description 发送Http请求      * @param request      * @return      */     private static String sendRequ

浏览器访问一个网站的背后到底经历了什么?

如题,通过浏览器访问一个网站的背后到底经历了什么? 内容来自:https://www.cnblogs.com/yangliheng/p/6112955.html 前言 来吧,随我一起来整理下HTTP与DNS协议吧,无论你是Dev or Ops这些都是你必须要知道的基础网络知识,如上图所示,我们把用户访问网站的流程大概分为了两大部分: DNS(用于解析域名的IP地址) HTTP(得到IP地址之后从服务器获取数据) 基于上面的两个点,就让我么来深刻的讨论下到底什么是DNS and HTTP把. Wh

记录我开发工作中遇到HTTP跨域和OPTION请求的一个坑

我通过这篇文章把今天工作中遇到的HTTP跨域和OPTION请求的一个坑记录下来. 场景是我需要在部署在域名a的Web应用里用JavaScript去消费一个部署在域名b的服务器上的服务.域名b上的服务也是我开发的,因此我将域名a加到了该服务的HTTP响应结构的头文件里,这样就允许了域名a上的JavaScript代码用AJAX访问域名b的服务. 域名b上的服务是一个Servlet,允许域名a跨域访问的代码就一行: protected void doGet(HttpServletRequest req