ZBLOG

let xhr = new XMLHttpRequest(); let conf; let path = window.location.pathname; if (path[path.length - 1] === "/") { path = path.substring(0, path.length - 1); } if (sdp_web_appid) { xhr.open('GET', path + '/sdpw...

要将这段代码改造为异步模式,可以使用 Promiseasync/await 结合异步 XHR(或更现代的 fetch API)。以下是具体改造方案:


方案 1:使用 异步 XHR + Promise

  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. try {
  13. const conf = JSON.parse(xhr.responseText);
  14. resolve(conf);
  15. } catch (e) {
  16. reject(new Error("Failed to parse config JSON"));
  17. }
  18. } else {
  19. reject(new Error(`Request failed with status ${xhr.status}`));
  20. }
  21. };
  22. xhr.onerror = () => reject(new Error("Network error"));
  23. xhr.send();
  24. });
  25. }
  26. // 调用示例
  27. fetchConfigAsync()
  28. .then(conf => {
  29. if ('onclick' in self) {
  30. sdpHook(self, conf, "main");
  31. } else if ('onfetch' in self) {
  32. // Handle fetch case
  33. } else {
  34. sdpHook(self, conf, "worker");
  35. }
  36. })
  37. .catch(error => console.error("Failed to load config:", error));

方案 2:使用 Fetch API(更简洁)

  1. async function fetchConfigAsync() {
  2. let path = window.location.pathname;
  3. if (path.endsWith("/")) path = path.slice(0, -1);
  4. const url = sdp_web_appid
  5. ? `${path}/sdpwebproxyconf?GratuitousProxy=${sdp_web_appid}`
  6. : `${path}/sdpwebproxyconf`;
  7. try {
  8. const response = await fetch(url);
  9. if (!response.ok) throw new Error(`HTTP error ${response.status}`);
  10. const conf = await response.json();
  11. if ('onclick' in self) {
  12. sdpHook(self, conf, "main");
  13. } else if ('onfetch' in self) {
  14. // Handle fetch case
  15. } else {
  16. sdpHook(self, conf, "worker");
  17. }
  18. } catch (error) {
  19. console.error("Failed to load config:", error);
  20. }
  21. }
  22. // 调用
  23. fetchConfigAsync();

关键改进点

  1. 非阻塞:异步请求不会冻结线程,其他代码可以继续执行。
  2. 错误处理:通过 try/catch(或 .catch())集中处理网络/解析错误。
  3. 现代语法
    • fetch API 自动返回 Promise,支持 async/await
    • path.endsWith("/") 替代手动长度检查。

注意事项

  • 兼容性:如果需支持旧浏览器(如 IE),需用回 XHR + Promise。
  • 依赖注入:若 sdpHook 是外部依赖,确保它在调用前已加载。

改造后,你的应用将不再因同步请求卡住,整体响应性和用户体验会显著提升!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?