想象一下以下情况:
我们的网站触发了大约 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(使用前将#替换为@)