【问题标题】:Is there a way to fake a synchronous XHR request?有没有办法伪造同步 XHR 请求?
【发布时间】:2013-05-16 22:52:57
【问题描述】:

我正在使用 Emscripten 系统将一堆 C++ 代码移植到 Javascript。 C++ 代码对fopen 有很多调用,这是一个同步 IO 调用。在 Emscripten 中,我们使用对本地资源的 XHR 请求来模拟这一点然而,在 Firefox 中,同步 XHR 调用(使用 blobarraybufferresponseType)仅在 Web- 中受支持工人。转换所有 c++ 代码以适应异步 IO 代码似乎非常复杂,所以对于我的第一次尝试,我想看看我是否可以伪造一个同步 XHR 请求。

我最初的想法是主循环可以与 web-worker 共享一些状态,这可以进行同步 io 调用并在主循环暂停并等待 web-worker 完成时更新共享状态。免责声明:我知道这不是典型的 Javascript 方式,但我正在移植同步代码,而不是从头开始编写新代码(我肯定会使用异步 IO)。

鉴于网络工作者和主循环之间共享状态的限制,这个想法看起来站不住脚。

还有其他方法吗?

【问题讨论】:

  • “在 Firefox 中同步 XHR 调用仅在 Web-Worker 中支持” 这听起来确实不对。
  • 这是我获得此信息的地方:github.com/kripken/emscripten/wiki/Filesystem-Guide“警告:Firefox 和 Chrome 最近禁用了同步二进制 XHR,这意味着这无法工作”
  • @squint OP 没有很好地解释它(直到他在上面发表评论),但在 MDN 的XHR page 上进一步解释了它:“从 Gecko 11.0 开始......以及 WebKit build 528,这些浏览器不再允许您在执行同步请求时使用responseType 属性。”这意味着您无法使用“arraybuffer”或“blob”的responseType 取回二进制数据;这样做(我假设)是为了明确阻止以同步方式获取(可能非常大)二进制资源。
  • 绝对没有办法将异步行为封装在同步函数中。也无法从 Web 工作者那里获得同步结果,因为它们只能通过异步事件进行通信。我能想到的唯一可能的解决方案是不设置responseType(从而允许同步获取),将响应作为原始文本处理,并以某种方式将其转换回数组缓冲区中的干净二进制数据。
  • 您可以找到一种方法来检测应用程序启动之前将由 ajax 获取的每个 URL;可能是一个正则表达式或更正式的构建步骤。它不需要是完美的,额外的垃圾是可以的。然后,您使用异步 ajax 从磁盘加载所有数据以构建查找表对象,键为 url 并为响应赋值。然后,您可以通过重新定义同步 ajax 函数向对象发出虚拟同步请求。文件预加载后,正常启动您的应用程序。

标签: javascript asynchronous xmlhttprequest synchronous web-worker


【解决方案1】:

因此,在查看了所有答案并自己阅读了一些内容之后,似乎最好的答案是:“可以,但仅限于文本数据,并且必须将其转换回二进制数据”。这很慢,但确实有效。

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data?redirectlocale=en-US&redirectslug=DOM%2FXMLHttpRequest%2FSending_and_Receiving_Binary_Data#Receiving_binary_data_in_older_browsers

【讨论】:

    【解决方案2】:

    您是否看过像 qunit 和 sinon 这样的测试库?我觉得茉莉或许也能做到,但我知道诗乃能做到这一点

    http://sinonjs.org/docs/#server

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 2022-06-17
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多