从我的应用程序中,我需要使用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。 有什么建议让它起作用吗?
答案 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,是什么导致阻塞,什么样的操作本质上是非阻塞的(即,实际上不需要工作者在自己的线程上运行)。