为什么Firefox等到javascript函数完成后才启动另一个函数?

时间:2010-07-28 22:04:09

标签: javascript multithreading firefox gwt

我们正在前端使用GWT开发一个Web应用程序。

在GWT中,我们通过附加如下所示的javascript代码来调用服务器:

    public native static void call(int requestId, String url, ICall handler) /*-{
   var callback = "callback" + requestId;

   //Create a script element.
   var script = document.createElement("script");
   script.setAttribute("src", url+callback);
   script.setAttribute("type", "text/javascript");
   script.setAttribute("async", "true");

   //Define the callback function on the window object.
   window[callback] = function(response) {
     handler.@com.xxx.yyy.gui.net.ICall::handleResponse(Ljava/lang/String;)(response);
   } 

   //Attach the script element to the document body.
   document.body.appendChild(script);
  }-*/;

有些电话需要一分钟才能完成,其他一些电话只需几秒钟。如果我们同时进行多个调用,则所有调用都是并行执行的。这意味着以2秒结束的呼叫不必等到持续一分钟结束的呼叫。这在Chrome和Safari中都是如此。但是,Firefox会等到第一个调用的函数完成后才能启动其他函数。

为什么Firefox会等到javascript函数完成才能启动另一个函数?如何解决这个问题?

由于

4 个答案:

答案 0 :(得分:2)

您可以通过Web worker使用HTML5和多线程JavaScript。首先检查您的浏览器是否支持此功能。

function supports_web_workers() {
  return !!window.Worker;
}

然后开始使用多线程。

   // thread1
   var myBread = new Worker('bread.js');

   // thread2
   var myButter = new Worker('butter.js');

我自己从来没有尝试过,所以如果我错了,请纠正我。

答案 1 :(得分:0)

您可能必须显式处理流程以使Firefox并行运行(Firefox最近没有发布,因此他们对并行的支持可能比最近更新的chrome和safari更弱)。也可能是Firefox有一些关于同时从多个方法访问对象的问题。

代码全部被注释掉的原因是什么?

答案 2 :(得分:0)

除非您使用worker threads(自Firefox 3.5以来),否则网络上的JavaScript是单线程的。这就是网络设计的工作方式,所有浏览器都会以同样的方式做事。

答案 3 :(得分:0)

你的问题有点不正确,因为你没有像你想象的那样使用xhr而是脚本注入(jsonp)。在这种情况下,firefox将并行下载文件,但按文件提交给DOM的顺序执行文件。

相关问题