当一个巨大的javascript正在执行时,Firefox没有响应状态

时间:2014-04-10 07:40:18

标签: javascript firefox gwt

我有一个GWT应用程序,它在Firefox中运行时,会使它经常进入Not Responding状态。

我尝试在 about:config 页面中将 dom.max_script_run_time dom.max_chrome_script_run 时间设为 0 ,让Firefox永远运行javascript。 即使这样,浏览器也会进入Not Responding状态。

有没有解决方法呢?

2 个答案:

答案 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中运行您的应用程序。