Können Servicemitarbeiter auf synchrone XHR-Anfragen antworten?

Lesezeit: 4 Minuten

Benutzer-Avatar
Jeremy

Ich möchte Service Worker einsetzen, um eine bestehende Website zu verbessern. Insbesondere möchte ich einen besseren Offline-Support hinzufügen, indem Service Worker auf Anfragen mit Platzhalterressourcen antworten, wenn die eigentlichen Ressourcen nicht verfügbar sind. Dieser Ansatz hatte funktioniert, aber ich bin auf ein Hindernis gestoßen. Es gibt ein paar Stellen auf der Website, wo synchron XHR-Anfragen werden verwendet, um bestimmte Ressourcen zu laden, und mein Servicemitarbeiter erhält keine Ereignisse für sie in Chrome. (Bitte schlagen Sie nicht vor, synchrone XHR-Anforderungen zu eliminieren. Das ist erwünscht, aber außerhalb des Geltungsbereichs.)

Soll es für einen Service Worker möglich sein, auf synchrone XHR-Anfragen zu antworten? Ich könnte mir vorstellen, dass dies kompliziert zu implementieren ist, und würde es verstehen, wenn es nicht unterstützt würde. Eine “richtige” Antwort sollte zwischen den stehen W3C Service Workers Specification (Arbeitsentwurf) und der WHATWG Abrufspezifikation (Living Standard), aber ich bin noch nicht fertig damit, sie zu entschlüsseln. Ich würde mich über eine Erläuterung freuen, wie die Spezifikationen beschreiben, ob dies unterstützt werden sollte oder nicht, und/oder Hinweise auf Diskussionen über die Spezifikation oder Implementierung dieses Verhaltens.

Benutzer-Avatar
Jeremy

In der Theorie

Ja, Servicemitarbeiter sollten in der Lage sein, auf synchrone XHR-Anfragen zu antworten. Dies wird in den Spezifikationen nicht ausdrücklich angegeben, aber es gibt keine Ausnahme, die dazu führen würde, dass synchrone XHR-Anforderungen anders behandelt werden, und die W3C-Suite für Webplattformtests (WPT) verfügt über einen Testfall, um zu überprüfen, ob sie unterstützt wird: wpt/service-workers/service-worker/fetch-request-xhr-sync.https.html.

In der Praxis

Ab Januar 2019 können Servicemitarbeiter auf synchrone XHR-Anfragen in Firefox und Edge antworten, aber nicht in Chrome oder Safari. Chrom ist planen, bald Unterstützung hinzuzufügenaber wir wissen nicht, ob Safari das jemals tun wird.

Eine aktuelle Browser-Support-Matrix ist verfügbar bei WPT.fyi. Sie können den WPT-Testfall in Ihrem eigenen Browser unter ausführen https://w3c-test.org/service-workers/service-worker/fetch-request-xhr-sync.https.html.

  • Ich denke, der Teil “Planung, bald Unterstützung hinzuzufügen” könnte entfernt werden, da es zwei Jahre her ist, und den Kommentaren nach zu urteilen, haben sie diesen Satz nicht als Priorität.

    – lovassoa

    4. Mai 2021 um 13:15 Uhr

  • Wichtiger Hinweis: Servicemitarbeiter scheinen in der Lage zu sein, auf synchrone XHR-Anfragen zu antworten von einem Webworker gesendet – zumindest bei meinen bisherigen Versuchen. Ich habe nichts Offizielles dazu, also weiß ich nicht, ob es garantiert ist, aber ich habe Firefox, Chrome und Safari getestet. Das Senden der Anfragen von einem Webworker ist mein Anwendungsfall und dieser Beitrag hat mich beunruhigt, aber als ich mir den WPT-Testfall ansah, vermutete ich, dass der Grund, warum es nicht funktionierte, wahrscheinlich (hoffentlich) darin lag, dass die Anfrage von der Hauptleitung gesendet wurde Gewinde.

    – Alex Saal

    16. Januar um 10:59 Uhr

  • Ich kann überprüfen, ob die synchronen Anforderungen, die vom Haupt-Thread stammen, nicht vom Dienstmitarbeiter abgefangen werden!

    – Sotiris Zegiannis

    10. April um 10:18 Uhr

Benutzer-Avatar
Salve

Entsprechend XMLHttpRequest-Spezifikationdas Abrufverfahren für synchrone und asynchrone Anfragen ist der gleich also theoretisch sollte es doch abgefangen werden Synchrones XHR ist veraltet Ich würde also nicht erwarten, dass Chrome dies behebt.

Sie könnten einen synchronen Effekt erzeugen, indem Sie asynchrone Aufrufe miteinander verketten. Es erstellt eingerückte Rückrufe – während Versprechungen den Code leichter lesbar machen würden – aber der zweite Ajax-Aufruf wird erst ausgeführt, nachdem der erste zurückgekehrt ist. Beachten Sie, dass der 3. Parameter in beiden Aufrufen auf true gesetzt ist.

// 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();

Es ist nur ein Beispiel. Ich gehe davon aus, dass Versprechen genauso einfach verkettet werden könnten (aber vertikal gestapelt, anstatt rechts eingerückt), um einen synchronen Effekt zu erzeugen.

  • In Chrome wird das nicht möglich sein. Siehe diese Links: stackoverflow.com/questions/27693814/… developer.google.com/web/updates/2012/01/…

    – Klump

    16. März 2016 um 23:40 Uhr

  • Laut den Kommentaren Nr. 23-27 dieses Chromium Bugs-Listenbeitrags sollte die Synchronisierung von XHR weiterhin für Chrome funktionieren: bugs.chromium.org/p/chromium/issues/detail?id=392311 Ich weiß nicht, warum es für Ihr obiges Codebeispiel nicht funktioniert: “S-XHR: [not found]”, aber ich habe versucht, Ihnen dabei zu helfen, das zu beheben. Die Links zeigen einfach, dass Leute zuvor auf SO gefragt haben: “Werden Chrome und andere Browser die Unterstützung für Synchronous XMLHttpRequest einstellen?” Die Antworten auf SO schlagen “Ja” vor, aber Chrome-Entwickler sagten ” nein”: stackoverflow.com/questions/30876093/…

    – Klump

    17. März 2016 um 0:49 Uhr

1005760cookie-checkKönnen Servicemitarbeiter auf synchrone XHR-Anfragen antworten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy