gpt4 book ai didi

javascript - Worker 使用同步 XMLHttpRequest 从 GUI 获取数据

转载 作者:数据小太阳 更新时间:2023-10-29 04:20:03 25 4
gpt4 key购买 nike

我想要一个 Web Worker它位于调用堆栈的深处,能够发出同步请求以从 GUI 获取信息。

GUI 本身没有被阻塞——它能够处理消息。但是 worker 栈上的 JavaScript 并没有写在 async / await 中。风格。它只是很多同步代码。因此,如果 GUI 尝试使用 postMessage 将响应发送回 worker,那只会卡在 onmessage() 队列中。

我发现了至少一种适用于当今浏览器的 hack。工作人员可以向 GUI 发送消息以获取它想要的信息——连同某种 ID(例如 UUID)。然后它可以生成同步 XMLHttpRequest-- which is not deprecated on workers -- 使用该 ID 发送到网络上的某个服务器。

当工作人员等待该 http 请求时,GUI 会处理信息请求。完成后,它会执行 XMLHttpRequest 以使用 ID 和数据 POST 到同一服务器。服务器然后使用该信息来完成它为工作人员打开的阻塞请求。这样就完成了同步请求。

将 GUI 和 worker 之间的同步外包给服务器似乎是轻率的。但如果必须的话,我会这样做,因为它不适合强制以异步方式编写工作代码的用例。另外,我假设总有一天 浏览器将能够在本地进行这种同步。但它看起来像是一种可以使用的机制——SharedArrayBuffer , 已暂时禁用。

UPDATE circa late 2018: SharedArrayBuffer was re-enabled in Chrome for desktop v67. It's not back on for Android Chrome or other browsers yet, and might be a while.

(像 compiling a JavaScript interpreter into the worker 这样 JS 堆栈可以随意暂停和重新启动的更奇怪的选项不在桌面上——不仅仅是因为大小和性能,而且无法使用浏览器的开发者工具。)

所以...

  • 有没有办法让同步 XMLHttpRequest 被愚弄,从浏览器本身发出请求(可能通过自定义链接方案?)如果 GUI 线程可以直接回答 XMLHttpRequest摆脱中间人。

  • 是否可以通过某种插件提供相同的功能?我在想也许同步可以作为一种抽象来完成。如果有人没有该插件,它会回退到使用网络作为同步代理。 (并且大概如果他们重新启用 SharedArrayBuffer,它就可以使用它。)

我还想知道是否有某种现成的 JS 就绪服务已经实现了回显服务器的协议(protocol)...如果有人知道的话。看起来很容易写。

最佳答案

我看不出有什么方法可以完成您想要做的事情。最初看起来很有希望的方法最终会遇到难题。

Service Workers 和fetch

在评论中,您建议使用服务工作线程作为可能的解决方案。我见过的服务 worker 示例提到提供“对请求的自定义响应”。但是,所有示例都使用 fetch事件以提供自定义响应。 AFAIK,它仅在您实际使用 fetch API 时生成具体来说。 xhr 不会生成获取事件。 (是的,我已经试过了,但没有用。)而且你不能在你的特定情况下只使用 fetch 而不是 xhr,因为 fetch 不会同步运行。 fetch 的规范提到了一个“同步标志”,但它是 not part of the API .

请注意,fetch API 和关联的事件不是 特定 服务工作线程,因此您可以在普通工作线程中使用 fetch,或者其他地方,如果它解决了你的问题。您经常会看到 fetch 提到 service worker,因为 service worker 可用于无法使用常规 worker 的场景,其中一些场景需要为 fetch 请求提供自定义响应。

伪造的 XMLHttpRequest

Marinos An 建议 comment使用伪造的 XMLHttpRequest 对象。 在大多数情况下,这会起作用。像 Sinon 这样的测试框架提供伪造的 XMLHttpRequest,允许测试代码完全控制被测代码获得的响应。但是,它不适用于您的用例场景。如果你的假 xhr 实现是作为一个 JavaScript 对象实现的,并且你尝试将它发送给工作人员,工作人员将获得它的完整克隆。在 worker 内部对假 xhr 执行的操作不会在 worker 外部看到。在 worker 外部执行的假 xhr 操作不会在 worker 内部看到。

理论上可以通过让伪造的 xhr 包含两个对象来解决克隆问题:一个是执行请求的前端,另一个是建立伪造响应的后端。您可以将前端发送给工作人员,但前端和后端必须相互通信,这让您又回到了您试图解决的通信问题。如果您可以让伪造的 xhr 的两个部分以一种允许您伪造同步 xhr 请求的方式相互通信,那么出于同样的原因您将能够解决通信问题而无需假 xhr.

关于javascript - Worker 使用同步 XMLHttpRequest 从 GUI 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51351983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com