使用XMLHTTPRequest从JavaScript worker进行轮询

时间:2013-12-04 16:29:55

标签: javascript asynchronous xmlhttprequest polling worker

我正在尝试创建一个同时执行以下操作的工作程序:

  1. 将XMLHTTPRequest发送到服务器以执行任务(可以 需要很长时间)

  2. 每隔X秒发送一次XML HTTP请求消息,以获取进程的更新,直到进程(1)完成。

  3. 到目前为止我的内容如下。但它没有民意调查。第一部分成功执行。第二位只运行一次。有谁知道我做错了什么?

    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);
                }       
                })();
    
    
    };
    

1 个答案:

答案 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来完成它!