Как справиться с ограничением параллельных запросов браузера на домен в случае приоритетного запроса AJAX?

представьте себе следующую ситуацию:

есть около 20 запросов (или даже больше), которые были вызваны нашим сайтом. Это могут быть любые запросы - мы не знаем, как вызвать их снова. На этом веб-сайте все запросы нацелены на один и тот же url-адрес. Запросы могут иметь подписанные прослушиватели событий.

в случае использования Chrome, первые 6 запросов отправляются, а другие ждут в очереди для отправки (из-за параллельный запрос ограничение на домен).

в этот момент веб-страница запускает очень важный запрос (назовем его "VIR"), который имеет более высокий приоритет для отправки на сервер, чем предыдущие 20 запросов. Другие запросы (и их слушатели событий) также важны, поэтому мы не можем просто прервать их, чтобы немедленно отправить VIR.

нам нужно решение, чтобы получить все отложенные запросы (6 отправлено + 14 в очереди), прервать их, затем отправить VIR, а затем отправить другие снова С теми же слушателями событий, что и раньше.

в случае отсутствия другого (из коробки) решения, 2 основных вопроса:

  • можно ли получить ссылку на все ожидающие запросы (включая очередь)?
  • можно ли прервать xhr, а затем отправить его снова (клонируя их как-то, или я не знаю)?

и еще один связанный с этим вопрос:

  • я помню что ограничение параллельных запросов на Имя хоста является ограничением для браузера, а не только для текущей вкладки. Есть волшебное решение, чтобы справиться с этим? Если да, то действительно ли я хочу это написать? :)

помните из этого все запросы должны быть отправлены тот же домен. (Означает, что таргетинг на другой домен с помощью VIR здесь не является опцией). Однако использование websocket или http / 2 может решить основную проблему, это не варианты в этом текущий вопрос.

Я ценю любую идею об этом! Заранее спасибо!

pm.: И да, это вопрос javascript:)

1 ответов


вы можете продолжать использовать то же самое 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);
  })
}