我有一个GWT应用程序,它在Firefox中运行时,会使它经常进入Not Responding状态。
我尝试在 about:config 页面中将 dom.max_script_run_time 和 dom.max_chrome_script_run 时间设为 0 ,让Firefox永远运行javascript。 即使这样,浏览器也会进入Not Responding状态。
有没有解决方法呢?
答案 0 :(得分:1)
如果您所做的工作对于单个脚本运行来说太大而没有锁定浏览器,那么您需要以某种方式打破这项工作。如果没有你正在做的工作细节,我只能提供一般性的想法。
正如Teemu所描述的,第一个选项是Web worker,这很好,因为它们使用单独的线程来执行,因此可以真正加快页面速度。不幸的是,web worker是为数据处理而设计的,而不是数据显示,所以它们没有dom访问权,所以如果你要做的事情就是编写很多dom对象,这可能不是正确的解决方案。此外,它是一项相对较新的技术,因此浏览器支持可能成为一个问题。
我过去使用的稍微低一点的技术解决方案是迭代器类,它传递一个大数组和一个要处理的函数,它使用settimeout将执行分解为块而不会使浏览器过载。下面是一些示例代码:
var Iterator = function( items, callback, complete )
{
this.items = items;
this.itemCount = this.items.length;
this.currentItem = 0;
this.callback = callback;
this.completeFunction = complete || function(){};
this.interval = 50;
this.started = false;
this.ajax = false;
this.start = function()
{
if( this.started ) return false;
var _this = this;
if( this.itemCount < 1 )
{
this.complete();
}
else
{
this.started = true;
this.timeout = setTimeout( function(){ _this.progress(); }, _this.interval );
}
};
this.addItem = function( item )
{
this.items.push( item );
this.itemCount = this.items.length;
}
this.clearItems = function()
{
this.items = [];
this.itemCount = 0;
this.currentItem = 0;
this.started = false;
}
this.progress = function()
{
this.currentItem++;
var item = this.items[ this.currentItem - 1 ];
if( ! this.ajax )
{
this.callback( item, this.currentItem, this.itemCount );
this.next();
}
else
{
this.callback( item, this );
}
};
this.next = function()
{
var _this = this;
if( this.currentItem >= this.itemCount )
{
this.complete();
}
else
{
this.timeout = setTimeout( function(){ _this.progress(); }, this.interval );
}
}
this.complete = function()
{
this.completeFunction();
this.clearItems();
};
};
用法:
var it = new Iterator(
// items to process
[1,2,3,4,5],
// processing function
function( item, currentItem, totalItems ){
// process the item
// write the item to the DOM
// perhaps show a progress bar?
},
// complete function
function(){
// display completed message
// perhaps hide the progress bar?
}
);
it.start();
答案 1 :(得分:0)
在代码中寻找无限循环。现在,你不太可能通过提供太多的代码来挂起浏览器。
在循环中添加GWT.log()语句以检查哪一个导致问题,然后在DevMode中运行您的应用程序。