Могут ли Service Workers отвечать на синхронные запросы XHR?

Я хотел бы использовать Service Workers для улучшения существующего веб-сайта. В частности, я хотел бы улучшить автономную поддержку, заставив сервис-воркеров отвечать на запросы с замещающими ресурсами, когда фактические ресурсы недоступны. Этот подход работал, но я столкнулся с препятствием. На сайте есть несколько мест, где синхронные запросы XHR используются для загрузки определенных ресурсов, и мой Service Worker не получает для них события в Chrome. (Пожалуйста, не предлагайте исключать синхронные запросы XHR. Это желательно, но выходит за рамки.)

Предполагается ли, что Service Worker может отвечать на синхронные запросы XHR? Я мог представить, что это сложно реализовать, и понял бы, если бы это не поддерживалось. «Правильный» ответ должен существовать между Спецификацией W3C Service Workers (рабочий проект) и Спецификация WHATWG Fetch (уровень жизни), но я еще не закончил их расшифровку. Я был бы признателен за объяснение того, как спецификации описывают, должно ли это поддерживаться или нет, и/или любые ссылки на обсуждения по указанию или реализации этого поведения.


person Jeremy    schedule 08.03.2016    source источник


Ответы (3)


Согласно спецификации XMLHttpRequest, процедура выборки как для синхронных, так и для асинхронных запросов является одинаковой, поэтому теоретически он должен быть перехвачен, но Synchronous XHR устарел, поэтому я не ожидаю, что Chrome исправит это.

person Salva    schedule 09.03.2016

В теории

Да, сервисные работники должны иметь возможность отвечать на синхронные запросы XHR. Это прямо не указано в спецификациях, но нет никаких исключений, которые могли бы привести к тому, что синхронные запросы XHR будут обрабатываться по-разному, и в наборе тестов веб-платформы W3C (WPT) есть тестовый пример для проверки его поддержки: wpt/service-workers/service-worker/fetch-request-xhr-sync.https.html.

На практике

По состоянию на январь 2019 года сервисные работники могут отвечать на синхронные запросы XHR в Firefox и Edge, но не в Chrome или Safari. Chrome планирует добавить поддержку в ближайшее время, но мы не знаем, будет ли когда-нибудь Safari.

Доступна актуальная матрица поддержки браузеров на WPT.fyi. Вы можете запустить тестовый пример WPT в своем браузере по адресу https://w3c-test.org/service-workers/service-worker/fetch-request-xhr-sync.https.html.

person Jeremy    schedule 23.01.2019
comment
Я думаю, что планирование добавления поддержки в ближайшее время может быть удалено, так как прошло два года, и, судя по комментариям, у них это не установлено в качестве приоритета. - person lovasoa; 04.05.2021

Вы можете создать синхронный эффект, объединив асинхронные вызовы вместе. Он создает обратные вызовы с отступом, в то время как обещания облегчают чтение кода, но второй вызов Ajax не будет выполнен до тех пор, пока не вернется первый. Обратите внимание, что для третьего параметра установлено значение true в обоих вызовах.

// Synchronized Ajax calls using 2 nested Asynchronous calls

// Asynchronous request #1 using traditional API
const axhr = new XMLHttpRequest();
axhr.open('GET', '/__so-example__', true);
axhr.onload = event => {
  console.log("A-XHR: " + axhr.responseText);

  // Asynchronous request #2 using traditional API
  const sxhr = new XMLHttpRequest();
  sxhr.open('GET', '/__so-example__', true);
  sxhr.onload = event => {
    console.log("S-XHR: " + sxhr.responseText);
  }
  sxhr.send();
}
axhr.send();

Это просто пример. Я предполагаю, что промисы можно так же легко связать в цепочку (но сложить вертикально, а не с правым отступом), чтобы создать синхронный эффект.

person Clomp    schedule 16.03.2016
comment
В Хроме сделать это будет невозможно. См. эти ссылки: stackoverflow.com/questions/27693814/ developers.google.com/web/updates/2012/01/ - person Clomp; 17.03.2016
comment
Согласно комментариям № 23–27 к этому сообщению со списком ошибок Chromium, синхронизация XHR должна по-прежнему работать для Chrome: bugs.chromium.org/p/chromium/issues/detail?id=392311 Я не знаю, почему это не работает для вашего примера кода выше: S-XHR: [не найдено] , но я пытался помочь вам исправить это. Ссылки просто показывают, что люди спрашивали раньше о SO. Прекратят ли Chrome и другие браузеры поддержку синхронного XMLHttpRequest? Ответы на SO предполагают «да», но разработчики Chrome сказали «нет»: title="прекратят ли Chrome и другие браузеры поддержку синхронного xmlhttprequest">stackoverflow.com/questions/30876093/ - person Clomp; 17.03.2016