服务工作者能够响应同步XHR请求吗?

24
我希望使用 Service Workers 来增强现有的网站。具体而言,我想通过让 Service Workers 在实际资源不可用时响应请求以提供占位符资源来改善离线支持。这种方法之前一直有效,但我遇到了一个障碍。在网站中有一些地方使用同步 XHR 请求来加载某些资源,在 Chrome 中我的 Service Worker 并未接收到这些请求的事件。(请不要建议消除同步 XHR 请求。虽然这是期望的,但超出了范围。)
Service Worker 是否可以响应同步 XHR 请求?我可以想象这可能很复杂实现,并且如果不支持也能理解。 W3C Service Workers Specification (Working Draft)WHATWG Fetch Specification (Living Standard) 之间应该存在一个“正确”的答案,但我还没有完成解密。我希望说明规范如何描述是否应该支持此功能,或者任何关于指定或实现此行为的讨论的参考资料。
3个回答

9

理论上

是的,Service Worker 应该能够响应同步 XHR 请求。虽然规范中没有明确说明,但也没有任何例外会导致同步 XHR 请求被单独处理,而 W3C Web 平台测试套件(WPT)有一个测试用例来验证其支持性:wpt/service-workers/service-worker/fetch-request-xhr-sync.https.html

实际上

截至 2019 年 1 月,Firefox 和 Edge 支持 Service Worker 响应同步 XHR 请求,但 Chrome 和 Safari 不支持。Chrome 正在计划尽快添加支持,但我们不知道 Safari 是否会支持。

最新的浏览器支持矩阵可在 WPT.fyi 上查看。您可以在 https://w3c-test.org/service-workers/service-worker/fetch-request-xhr-sync.https.html 上运行 WPT 测试用例。


我认为可以删除“计划很快添加支持”的部分,因为已经过去两年了,而且根据评论来看,他们并没有将此设置为优先事项。 - lovasoa
重要提示:在我的实验中,Service worker似乎能够响应从Web Worker发送的同步XHR请求-至少在目前为止我测试了Firefox,Chrome和Safari。我没有官方文件来证明这一点,所以我不知道是否有保证,但是我已经进行了测试。从Web Worker发送请求是我的用例,这篇文章让我很担心,但是当我查看WPT测试案例时,我猜测它无法工作的原因可能(希望)是由于请求是从主线程发送的。 - Alex Hall
我可以验证,如果同步请求是从主线程发出的,则不会被服务工作者拦截! - Sotiris Zegiannis

6

0
你可以通过将异步调用链接在一起来创建同步效果。这会创建缩进的回调 - 而 Promise 可以使代码更易于阅读 - 但第二个 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();

这只是一个例子。我假设承诺可以像垂直堆叠一样轻松地链接在一起(而不是向右缩进),以创建同步效果。


在Chrome中这是不可能的。请参阅这些链接:http://stackoverflow.com/questions/27693814/how-to-do-a-synchronous-xmlhttprequest-in-chrome-app https://developers.google.com/web/updates/2012/01/Getting-Rid-of-Synchronous-XHRs?hl=en - Clomp
根据Chromium Bugs列表帖子的评论#23-27,同步XHR应该仍然适用于Chrome:https://bugs.chromium.org/p/chromium/issues/detail?id=392311。我不知道为什么它在您上面的代码示例中无法工作:“S-XHR:[未找到]”,但我正在尝试帮助您解决此问题。这些链接只是表明人们之前在SO上问过“Chrome和其他浏览器是否会停止支持同步XMLHttpRequest?” SO上的答案表明“是”,但Chrome开发人员表示“否”:https://dev59.com/h10Z5IYBdhLWcg3w8kL3 - Clomp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接