在优先 AJAX 请求的情况下,如何处理浏览器对每个域的并行请求的限制?

2023-12-19

想象一下以下情况:

我们的网站触发了大约 20 个(甚至更多)请求。这些可以是任何类型的请求 - 我们不知道如何再次触发它们。在此网站上,所有请求都针对同一 url。请求可以具有订阅的事件侦听器。

如果使用 Chrome,前 6 个请求将被发送,其他请求将在队列中等待发送(因为每个域的并行请求限制 http://www.browserscope.org/?category=network).

此时网页触发了一个非常重要的请求(我们称之为“VIR”),该请求比之前的 20 个请求具有更高的优先级发送到服务器。其他请求(及其事件侦听器)也很重要,因此我们不能只是中止它们以立即发送 VIR。

我们需要一个解决方案来获取所有待处理的请求(6 个已发送 + 队列中的 14 个),中止它们,然后发送 VIR,然后再次发送其他请求附加了与之前相同的事件侦听器。

如果没有其他(现成的)解决方案,两个基本问题是:

  • 是否可以获取所有待处理请求(包括队列)的引用?
  • 是否可以中止 xhr 然后再次发送(通过以某种方式克隆它们,或者我不知道)?

还有另一个相关问题:

  • 我记得每个主机名的并行请求限制是对浏览器的限制,而不仅仅是对当前选项卡的限制。有什么神奇的解决办法可以解决吗?如果是的话,我真的想写这个吗? :)

Be aware其中所有请求都必须发送到相同的域。 (意味着这里不可以选择使用 VIR 针对不同的域)。 然而,使用 websocket 或 http/2 可以解决基本问题,这些不是当前问题中的选项。

我很感激对此的任何想法! 提前谢谢!

pm.: 是的,这是一个 javascript 问题:)


您实际上可以继续使用相同的XmlHttpRequest中止请求后的实例,再次调用 open 和 send 方法,并且事件侦听器保持附加状态。通过重载 xhr open/send 方法更新了代码片段以保存 url 和有效负载:

var pending_requests = [], 
    XHRBase = {
      open: XMLHttpRequest.prototype.open, 
      send: XMLHttpRequest.prototype.send
    };

XMLHttpRequest.prototype.open = function() {

  pending_requests.push(xhr._data = {xhr: this, open: arguments});
  XHRBase.open.apply(this, arguments);
  // add event listener to pop on finish
}

XMLHttpRequest.prototype.send = function() {
  xhr._data.send = arguments;
  XHRBase.send.apply(this, arguments);
}

function priority_call(params, callback) {
  pending_requests.forEach((req) => req.xhr.abort());
  // do vip xhr
  pending_requests.forEach((req) => {
    XHRBase.open.apply(req.xhr, req.open); 
    XHRBase.send.apply(req.xhr, req.send);
  })
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在优先 AJAX 请求的情况下,如何处理浏览器对每个域的并行请求的限制? 的相关文章

随机推荐