- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我想要一个 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)...如果有人知道的话。看起来很容易写。
最佳答案
我看不出有什么方法可以完成您想要做的事情。最初看起来很有希望的方法最终会遇到难题。
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
请求提供自定义响应。
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/
如果一个域有多个团队和多个 Web 应用程序,那么注册 Service Worker 来管理整个站点的最佳建议是什么?具有范围的顶级服务 worker /或子域中的多个服务 worker ?由于一个域
我开发了一个应用程序来分析播放 YouTube 视频时的网络流量。它使用 chrome.webRequest,我使用 onHeadersReceived 事件计算流量。 我想使用 service wo
假设我提供了不同网站使用的推送通知服务。此服务需要在我的客户站点上安装服务 worker 。我希望架构具有一些属性: 完全静态资源。安装service worker文件和配置JS片段等过程只需要完成一
我要缓存某人网站中的特定请求 ,那么我发现 service worker 是一个不错的选择。但我找不到任何方法 通过 tampermonkey 注入(inject)一个 service worker
当 Service Worker 更新时,它不会以正确的方式控制页面;它进入“等待”状态,等待被激活。 令人惊讶的是,更新后的 Service Worker 甚至在刷新页面后都无法控制选项卡。谷歌解释
有谁知道是否有办法在 service worker 中获取此号码或日期: 将我的服务 worker 缓存命名为 cache-1182 会很方便或 cache-20171127171448 我想在安装事
这link说: Workers may spawn more workers if they wish. So-called sub-workers must be hosted within the
有许多关于使用 ngsw-worker.js 安装 ServiceWorker 的分步指南;然而,甚至没有关于使用 safety-worker.js 卸载 ServiceWorker 的分步指南。 s
我正在尝试为我的网站使用后台定期同步。我正在使用 localhost 并在 1*1000 毫秒时注册 periodicsync 事件,但这根本不会触发。 我看过这个demo ,但即使我将该网站安装为应
我试图让用户安排一个周期性任务。我还在一个容器中运行多个 celery worker 。我对该容器的命令过去是这样的: celery worker -c 4 -B -l INFO -A my.cele
从我所看到的,你甚至可以缓存一个网页。根据此文档:https://www.mnot.net/cache_docs/#BROWSER ,表示可以缓存在浏览器缓存中。我看到即使是 serviceworke
我只是在测试 Service Worker 的功能以了解其工作原理。所以现在我遇到了一个问题。 var CACHE_NAME = 'my-site-cache-v1'; var urlsToCache
下图显示安装了两名工作人员 - 一名处于事件状态,另一名未处于事件状态(刚刚安装)。 注册 service worker 更改 service-worker.js并重新加载页面。 逻辑是 Servic
我正在尝试学习渐进式 Web 应用程序的一些基础知识,并且在我阅读的其中一篇教程中学习 [在安装了 service worker 并且用户导航到不同的页面或刷新后,service worker 将开始
我正在开发一个应用程序,其目标是定期(例如每小时)向用户发送通知。 我的想法是使用一个可以在选项卡关闭后运行的服务 worker ,并继续向用户发送这些通知。 网页需要能够与 Service Work
我正在尝试为一个简单但旧的 Django Web 应用程序安装 ServiceWorker。我开始使用示例 read-through caching example from the Chrome t
在我们开发的情况下,我们提供来自 https://localhost 的文件因为该应用程序托管在 salesforce.com 中。在 chrome service worker 中,chrome 会
我是服务人员的新手,并且浏览了各种文档(Google,Mozilla,serviceworke.rs,Github,StackOverflow questions)。最有用的是ServiceWorke
我正在解决一个问题,我有一组“热情的 worker ”。这意味着它们被维护在内存中,维护自己的上下文并且是可调用的。我一直在研究各种 Go Worker 实现,但都依赖于闭包或返回结果的简单计算函数。
我有一个部署到静态服务器的非根路径的网络应用程序。即MyApp构建时部署到路径/文件夹 https://example.com/myapp . MyApp正在使用 vue 和 webpack 所以我添
我是一名优秀的程序员,十分优秀!