我们正在前端使用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函数完成才能启动另一个函数?如何解决这个问题?
由于
答案 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的顺序执行文件。