如何在以下脚本中添加超时?我希望它将文本显示为"超时".
var bustcachevar = 1 //bust potential caching of external pages after initial request? (1=yes, 0=no)
var loadedobjects = ""
var rootdomain = "http://" + window.location.hostname
var bustcacheparameter = ""
function ajaxpage(url, containerid) {
var page_request = false
if (window.XMLHttpRequest) // if Mozilla, Safari etc
page_request = new XMLHttpRequest()
else if (window.ActiveXObject) { // if IE
try {
page_request = new ActiveXObject("Msxml2.XMLHTTP")
} catch (e) {
try {
page_request = new ActiveXObject("Microsoft.XMLHTTP")
} catch (e) {}
}
} …Run Code Online (Sandbox Code Playgroud) 我想要一个深入调用堆栈的Web Worker,以便能够发出同步请求以从GUI获取信息.
GUI本身没有被阻止 - 它能够处理消息.但是工作者堆栈上的JavaScript不是用async/await风格编写的.它只是很多同步代码.因此,如果GUI试图发送一个响应返回给工人用的postMessage,那也只是停留在onMessage()队列.
我发现至少有一个黑客在今天的浏览器中运行. worker可以将postMessage发送到GUI以获取它想要的信息 - 以及某种ID(例如UUID).然后,它可以将具有该ID 的同步XMLHttpRequest (在工作者上不被弃用)发布到具有该ID的Web上的某个服务器上.
当worker正在等待该http请求时,GUI处理该信息请求.完成后,它会执行XMLHttpRequest以使用ID和数据POST到同一服务器.然后,服务器使用该信息来完成它为工作人员保持打开的阻止请求.这满足了同步请求.
将GUI和工作者之间的同步外包给服务器可能看起来很难理解.但是如果必须的话,我会这样做,因为它不适合用例强制工作程序代码以异步方式编写. 此外,我假设有一天浏览器将能够本地进行这种同步.但看起来可能已使用的一种机制 - SharedArrayBuffer,暂时被禁用.
UPDATE大约2018后期: SharedArrayBuffer被重新启用在Chrome桌面V67.它还没有重新开启Android Chrome或其他浏览器,可能还需要一段时间.
(更多奇怪的选项,比如将JavaScript解释器编译到worker中,以便JS堆栈可以随意暂停和重启)不仅仅是因为大小和性能,而是使用浏览器的开发人员工具无法调试工作者.)
所以...
是否有任何方法可以将同步XMLHttpRequest愚弄,从浏览器本身发出请求(可能是通过自定义链接方案?)如果GUI线程可以直接回答可以删除中间人的XMLHttpRequest.
是否可以通过某种插件提供相同的功能?我想也许同步可以作为抽象来完成.如果有人没有插件,则会回退到使用网络作为同步代理. (并且大概如果他们重新启用SharedArrayBuffer,它可以使用它.)
我也想知道是否有某种类型的JS-ready服务已经实现了echo服务器的协议......如果有人知道一个.看起来很容易写.