ZBLOG

let xhr = new XMLHttpRequest(); let conf; let path = ""; if (sdp_web_appid) { xhr.open('GET', path + '/sdpwebproxyconf' + '?GratuitousProxy=' + sdp_web_appid, false); } else { xhr.open('GET', path + '/sdpwebproxycon...

在 Web Worker 中执行同步 XMLHttpRequest(即 xhr.open 的第三个参数为 false)会导致卡住的问题,主要原因如下:


1. 浏览器安全策略限制

现代浏览器(如 Chrome、Firefox)默认禁止在 Web Worker 中使用同步 XHR,原因包括:

  • 主线程已废弃同步 XHR(因为会阻塞 UI),但 Worker 原本是允许的。
  • 新的安全策略要求
    如果要在 Worker 中使用同步 XHR,必须满足以下条件之一:
    • 服务端设置特定响应头
    1. Cross-Origin-Opener-Policy: same-origin
    2. Cross-Origin-Embedder-Policy: require-corp
    • 浏览器启用特殊标志(仅开发环境):
      例如 Chrome 启动时添加 --allow-sync-xhr-in-workers

如果不满足这些条件,调用 xhr.open(..., false) 时会直接阻塞,且不会发送请求。


2. Web Worker 的执行机制

  • Worker 是单线程环境,同步 XHR 会阻塞整个 Worker 线程。
  • 由于浏览器的限制,同步请求可能被 silently ignored(无错误提示),导致代码永久卡在 xhr.open

解决方案

方法 1:改用异步 XHR(推荐)

  1. let xhr = new XMLHttpRequest();
  2. let url = sdp_web_appid
  3. ? `${path}/sdpwebproxyconf?GratuitousProxy=${sdp_web_appid}`
  4. : `${path}/sdpwebproxyconf`;
  5. xhr.open('GET', url, true); // 异步模式
  6. xhr.onload = function() {
  7. if (xhr.status === 200) {
  8. conf = xhr.responseText;
  9. // 处理 conf
  10. } else {
  11. console.error("Failed to fetch config:", xhr.status);
  12. }
  13. };
  14. xhr.onerror = function() {
  15. console.error("XHR request failed");
  16. };
  17. xhr.send();

方法2:使用 Fetch API(更现代)

  1. const url = sdp_web_appid
  2. ? `${path}/sdpwebproxyconf?GratuitousProxy=${sdp_web_appid}`
  3. : `${path}/sdpwebproxyconf`;
  4. fetch(url)
  5. .then(response => {
  6. if (!response.ok) throw new Error(`HTTP ${response.status}`);
  7. return response.text();
  8. })
  9. .then(conf => {
  10. // 处理 conf
  11. })
  12. .catch(err => console.error("Fetch failed:", err));

⚠️ 方法3:强制允许同步 XHR(不推荐)

仅当完全控制服务端和客户端时:

  1. 服务端配置响应头
    1. Cross-Origin-Opener-Policy: same-origin
    2. Cross-Origin-Embedder-Policy: require-corp
  2. 浏览器启动参数(临时测试):
    1. chrome --allow-sync-xhr-in-workers

关键检查点

  1. 路径问题
    • path 是否为有效路径?Worker 中的相对路径是基于脚本位置,而非主页面 URL。
  2. 跨域问题
    • 如果是跨域请求,需确保服务端允许 CORS(如设置 Access-Control-Allow-Origin)。

总结

  • 🚫 避免在 Worker 中使用同步 XHR,除非明确知道如何配置安全策略。
  • 优先使用异步请求(XHR async/Fetch API)。

示例代码已提供优化方案,根据实际需求选择即可。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23236

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?