Können Servicemitarbeiter auf synchrone XHR-Anfragen antworten?
Lesezeit: 4 Minuten
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.
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.
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!
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.
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
10057600cookie-checkKönnen Servicemitarbeiter auf synchrone XHR-Anfragen antworten?yes