使用webworker的chrome的多线程功能?

时间:2014-01-06 13:30:21

标签: javascript jquery ajax web-worker worker

从我的应用程序中,我需要使用ajax请求运行复杂的函数,同时需要显示带有旋转图像的模态div。我尝试使用javascript在mozilla中工作正常,但在chrome中没有。作为一种解决方法,我尝试了网络工作者,如下所示。

main.js

this.Calculate=function(ii)
    {         
      worker.postMessage( {'cmd': 'start'});    
        myfun.calcfun(ii)
      worker.postMessage( {'cmd': 'stop'});           
    }
   var worker = new Worker("worker.js");     
    worker.onmessage = function(e) {   
     if(e.data==1 || e.data==0)
      {
       if(e.data==0)
           document.getElementById("divfade").style.display="none";
            else if( e.data==1)
            document.getElementById("divfade").style.display="block";
      }    
    }

worker.js

self.addEventListener('message', function(e) {
debugger
  var data = e.data;
  switch (data.cmd) {
    case 'start':
      self.postMessage(1);
      break;
    case 'stop':
      self.postMessage(0);
    //  self.close(); // Terminates the worker.
      break;
    default:
      self.postMessage('Unknown command: ' + data.msg);
  };
}, false);

但是worker.postMessage({'cmd':'start'});在myfun.calcfun(ii)之后执行。所以在服务器执行完成后会显示模态div。 有什么建议让它起作用吗?

1 个答案:

答案 0 :(得分:0)

你的实际问题有点模糊,但似乎是要确保模态/微调器在正确的时间显示和隐藏。你真的需要一个工人吗?

您是否考虑过使用jQuery.ajax的内置承诺?

function handler() {
    // Run code to show modal + spinner

    // At the same time, fire away a request to the server:
    var promise = $.ajax({ url: '/url' });

    promise.done(function(data)
    {
        // Response from server was OK, do your thing
    })
    .fail(function(jQXHR, textStatus, errorThrown)
    {
        // Something went wrong, inform your user
    })
    .always(function()
    {
        // Run code to hide modal + spinner
    });
}

这里是a very nice video explaining JavaScript’s event loop,是什么导致阻塞,什么样的操作本质上是非阻塞的(即,实际上不需要工作者在自己的线程上运行)。