【问题标题】:Keeping AJAX Requests Serial in jQuery在 jQuery 中保持 AJAX 请求串行
【发布时间】:2021-04-21 07:09:16
【问题描述】:

我有一些代码,我 recently moved to FastCGI for a backend 来满足来自基于 jQuery 的前端的 AJAX 请求。问题是,虽然 FastCGI 在很大程度上加速了它,但实际上我从两个 jQuery AJAX 请求连续太快地击中它得到了一个负面的性能问题。我想做的是“锁定”AJAX,以便请求以串行方式而不是并行方式发生——每个请求只需大约 180 毫秒即可执行,但如果第二个请求在第一个请求完成之前进入,则第二个请求最终需要大约一秒半的时间。

我想我可以使其串行化的明显方法是将$.ajax 请求放在上一个请求的.done 部分中,但是请求属于不同的功能,并且需要保持这种方式,因为它们没有并不总是需要一起被解雇——只是经常这样。想象一下:

function loadCategories () {
   // Do some organizing stuff, set url, etc.
    $.ajax({
        url: url,
        data: parameters,
        type: "GET",
        dataType : "json",
    })
      .done(function( json ) {
         //process sidebar category data.
      });
}

function loadArticles () {
   // Do some organizing stuff, set url, etc.
    $.ajax({
        url: url,
        data: parameters,
        type: "GET",
        dataType : "json",
    })
      .done(function( json ) {
         //process article data.
      });

}

这两个函数都在第三个函数中调用:

function loadPage (parameters) {
    loadCategories(parameters);
    loadArticles(parameters);
}

我想做的是在这两个函数中保留 .done.always 逻辑,而且从这些函数返回一个承诺,以便我可以使用 $.then防止loadArticles 被触发,直到loadCategories 完成。我试图找出正确的方法来做到这一点,但还没有成功地做到这一点。

【问题讨论】:

  • 如果您的 HTTP 服务器无法处理同时请求,则出现严重错误。如果一次有多个客户访问您的网站会怎样?

标签: javascript jquery ajax promise


【解决方案1】:

让函数返回$.ajax()返回的Deferred对象,然后你可以在调用函数中等待。

function loadCategories() {
  // Do some organizing stuff, set url, etc.
  return $.ajax({
      url: url,
      data: parameters,
      type: "GET",
      dataType: "json",
    })
    .done(function(json) {
      //process sidebar category data.
    });
}

function loadArticles() {
  // Do some organizing stuff, set url, etc.
  return $.ajax({
      url: url,
      data: parameters,
      type: "GET",
      dataType: "json",
    })
    .done(function(json) {
      //process article data.
    });
}

function loadPage(parameters) {
  $.when(loadCategories(parameters)).then(
    function() {
      loadArticles(parameters)
    };
  });
}

【讨论】:

  • 谢谢——这正是我需要的。我怀疑存在我需要解决的服务器问题,但就目前而言,这已将加载时间缩短了整整一秒。非常感谢!
猜你喜欢
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多