如果另一个正在进行中,请对ajax请求进行排队

时间:2016-05-12 21:03:47

标签: javascript jquery ajax promise jquery-deferred

我有一个应用程序在每个服务调用的响应中获取一个身份验证令牌,它应该发送前一个令牌作为下一个调用的参数,否则用户将被授权。一旦令牌不匹配,所有其他呼叫都会失败。

为了确保令牌不匹配,我在屏幕上添加了加载器并在启动ajax调用后立即显示它们并将加载覆盖保持在屏幕上,直到没有收到响应,否则用户可以点击在任何其他链接上会导致另一个ajax调用。

但是,我认为加载机制容易出现漏洞。有没有办法检查是否有任何ajax调用正在进行中,然后排队新的,并且排队的应该等待启动的响应,因为它需要从其响应返回的令牌作为其新的请求参数。

1 个答案:

答案 0 :(得分:1)

我刚刚参与了一个项目,我这样做了。假设您已经拥有了AJAX函数foo.ajax( url, callback )

您需要一种方法来打包AJAX请求中的所有详细信息。因此,您创建了一个函数foo.ajaxRequest(url)和一个请求列表foo.requestList = []并使用它们:

foo.ajaxRequest = function( url ) {
    foo.requestList.push(this);
    var callback = function( data ) {
        if ( foo.requestList.length ) {
           foo.requestList.shift().run( data );
        }
    }
    this.run = function( dataFromPreviousAjax ) {
        foo.ajax( url + "?key=" + dataFromPreviousAjax, callback );
    }
    if ( !foo.requestList.length ) {
        foo.ajax( url, callback ); 
    }
}

任何时候你想提出一些要求,你都要写

new foo.ajaxRequest("http://stackoverflow.com/pingback.php");
new foo.ajaxRequest("http://stackoverflow.com/pingback.php");

现在假设第一个请求返回12345的密钥,第二个请求现在将运行并调用网址"http://stackoverflow.com/pingback.php?key=12345"

显然你想在foo.ajaxRequest内的回调函数中使用返回值做更多的事情,但这应该让你开始。