ZBLOG

xhr.open 卡住了

如果 xhr.open 卡住(阻塞主线程),通常是因为您使用了 同步 XHRxhr.open 的第三个参数为 false)。现代浏览器已弃用同步 XHR,因为它会导致页面冻结,影响用户体验。以下是解决方案:


推荐方案:改用异步 XHR + Promise/Callback

  1. function fetchConfigAsync() {
  2. return new Promise((resolve, reject) => {
  3. const xhr = new XMLHttpRequest();
  4. let path = window.location.pathname;
  5. if (path.endsWith("/")) path = path.slice(0, -1);
  6. const url = sdp_web_appid
  7. ? `${path}/sdpwebproxyconf?GratuitousProxy=${sdp_web_appid}`
  8. : `${path}/sdpwebproxyconf`;
  9. xhr.open('GET', url, true); // true = 异步(默认值)
  10. xhr.onload = () => {
  11. if (xhr.status === 200) {
  12. resolve(JSON.parse(xhr.responseText));
  13. } else {
  14. reject(new Error(`HTTP ${xhr.status}`));
  15. }
  16. };
  17. xhr.onerror = () => reject(new Error("Network error"));
  18. xhr.send();
  19. });
  20. }
  21. // 使用示例(不阻塞后续代码)
  22. fetchConfigAsync()
  23. .then(conf => {
  24. if ('onclick' in self) sdpHook(self, conf, "main");
  25. else if ('onfetch' in self) { /* ... */ }
  26. else sdpHook(self, conf, "worker");
  27. // 【关键】所有依赖配置的代码写在这里
  28. initOtherFunctions();
  29. })
  30. .catch(error => console.error("加载配置失败:", error));
  31. // 【非依赖】的其他代码可立即执行
  32. console.log("正在加载配置,请稍候...");

⚠️ 为什么避免同步 XHR?

  1. 浏览器警告:Chrome/Firefox 会输出类似 [Deprecation] Synchronous XMLHttpRequest is deprecated 的警告。
  2. 性能问题:阻塞主线程导致页面无响应(按钮点击、动画等均无法执行)。
  3. 潜在崩溃:长时间同步请求可能触发浏览器终止脚本。

🌟 终极建议:升级到 Fetch API + Async/Await

更现代的写法(推荐):

  1. async function loadConfig() {
  2. let path = window.location.pathname.replace(/\/$/, "");
  3. const url = sdp_web_appid
  4. ? `${path}/sdpwebproxyconf?GratuitousProxy=${sdp_web_appid}`
  5. : `${path}/sdpwebproxyconf`;
  6. const response = await fetch(url);
  7. if (!response.ok) throw new Error(`HTTP ${response.status}`);
  8. return response.json();
  9. }
  10. // 使用示例
  11. (async () => {
  12. try {
  13. const conf = await loadConfig();
  14. // ...处理配置后的逻辑
  15. } catch (error) { /* ... */ }
  16. })();

如果必须强制同步?

极少数场景(如旧版浏览器兼容)可尝试:

  1. // ⚠️ 仅作演示,实际不推荐!
  2. const conf = (function() {
  3. let result;
  4. $.ajax({
  5. url: "...",
  6. async: false, // jQuery遗留的同步选项(底层仍是XHR)
  7. success: data => result = data
  8. });
  9. return result;
  10. })();

但强烈建议重构为异步逻辑。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?