【问题标题】:Queue ajax requests if another one is in progress如果另一个正在进行中,则排队 ajax 请求
【发布时间】:2016-05-13 05:49:42
【问题描述】:

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

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

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

【问题讨论】:

  • 让 ajax 请求立即执行,并将该请求的 Promise 存储在单例变量中,或者如果它看到单例被占用,则在之后执行其请求,这听起来似乎是合理的。您可能想知道,此系统中的任何请求超时都会使您处于非常不确定的状态,因为您的令牌可能已被服务器无效,也可能不会。不幸的是,在没有代码的情况下很难向您展示“如何”。您可能想至少尝试组合一个伪代码示例。
  • stackoverflow.com/questions/37098316/… 我之前发布了另一个查询,那里有我的 ajax 调用代码,当我实现它时,其他 ajax 调用的处理/排队将围绕它展开。
  • 关于超时部分。如果一个请求超时,则将进行下一次调用,如果令牌在服务器端重新生成,则用户将因令牌错误而注销,否则将使用相同的旧令牌。我认为 tineout 将是一种罕见的情况,不会成为主要问题。对吗?

标签: javascript jquery ajax promise jquery-deferred


【解决方案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 的键,第二个请求现在将运行并调用 url "http://stackoverflow.com/pingback.php?key=12345"

显然您希望在foo.ajaxRequest 内的回调函数中使用返回值做更多的事情,但这应该可以帮助您入门。

【讨论】:

  • 这似乎是对的。我会试试这个,让你知道这是否可行。
  • 如果foo.ajax() 返回一个promise,就像jQuery.ajax() 或angular 的$http() 一样?如上所述,调用者被拒绝访问承诺(或它的派生)。
  • @Roamer-1888 好点。不过,你想用这个承诺做什么?这里的主要思想是监禁 ajax 函数,这样你就不能同时运行两个函数;如果我们返回一个承诺,我们还会有那个保证吗...?
  • 如果调用者无法使用 AJAX 派生的数据做某事或处理 AJAX 错误,AJAX 调用就毫无用处。恕我直言,一个完整的解决方案应该做所有常见的事情执行计量/密钥传播以满足 OP 的要求。我不明白为什么两者都无法实现。
猜你喜欢
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
相关资源
最近更新 更多