2014-01-06 3 views
3

내 응용 프로그램에서, 나는 아약스 요청을 사용하여 복잡한 함수를 실행하고 회전하는 이미지가있는 모달 div를 표시해야합니다. 모질라에서 잘 작동하지만 크롬에서는 잘 작동하지 않는 javascript를 사용해 보았습니다. 임시 해결책으로 나는 아래와 같이 웹 작업자를 시도했다.웹 워커를 사용하는 크롬의 멀티 스레드 기능성?

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'를 '시작'}); myfun.calcfun (ii) 다음에 실행됩니다. modal div는 서버 실행이 완료된 후에 표시됩니다. 작동하게하려면 어떤 제안이 필요합니까?

답변

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, 그리고 작업의 어떤 종류의 비 차단 (예. 정말 그 자신의 스레드에서 실행하는 노동자를 필요로하지 않는) 본질적이다.