我正在尝试创建一个同时执行以下操作的工作程序:
将XMLHTTPRequest发送到服务器以执行任务(可以 需要很长时间)
每隔X秒发送一次XML HTTP请求消息,以获取进程的更新,直到进程(1)完成。
到目前为止我的内容如下。但它没有民意调查。第一部分成功执行。第二位只运行一次。有谁知道我做错了什么?
onmessage = function (e) {
e.data.params.task = "runTask"; // The server understands this. This performs(1)
// Sends an asynchronous request to perform (1)
var xhr = new XMLHttpRequest();
xhr.open('POST', e.data.url, false);
xhr.setRequestHeader("Content-type", "application/json");
xhr.send(JSON.stringify(e.data.params));
// initialise polling
var interval = 500;
// Poll until (1) is complete
(function poll(){
if (xhr.readyState != 4){ // while (1) is yet to be completed..
e.data.params.task = "getProgress";
// Send another request to the server to get an update on the first process
var pollxhr = new XMLHttpRequest();
pollxhr.open('POST', e.data.url, true);
pollxhr.setRequestHeader("Content-type", "application/json");
pollxhr.timeout = interval;
pollxhr.ontimeout = poll; // This should cause the process to poll
pollxhr.onreadystatechange = function(){
e.data.progress = pollxhr.responseText;
postMessage(e.data);
};
pollxhr.send(JSON.stringify(e.data.params));
}else{
e.data = xhr.responseText;
postMessage(e.data);
}
})();
};
答案 0 :(得分:1)
问题在于第一次调用
xhr.open('POST', e.data.url, false);
^^^^^
查看方法,您可以看到第三个参数是async
open(DOMString method, DOMString url, optional boolean async, optional DOMString? user, optional DOMString? password);
通过将其设置为false,您告诉它同步运行,这意味着在返回调用之前不会发生任何其他事情。这会导致您的轮询代码在第一次调用返回后运行。将其设置为异步运行并使用onreadystatechange来完成它!