Web工作者的行为与Firefox不同

时间:2011-12-16 00:53:56

标签: javascript firefox google-chrome webkit

我有一个在现代基于webkit的浏览器(http://montecarlo-tester.appspot.com/)中运行良好的Web应用程序。基本上它使用webworker从服务器获取数据,然后在执行一些计算后将其发回。

它在Chrome / Safari中运行良好(在控制台中没有错误),但是当我尝试在Firefox中使用它时,却没有。我已经推断出某些变量'iterations'在Firefox中没有正确设置。不幸的是,Firefox缺少调试器(对于Web工作者),并且javascript具有功能范围,因此很难确定问题所在。我已经为我的网络工作者发布了javascript代码,我想知道是否有人可以指出我出错的地方:

importScripts('/static/js/mylibs/jquery.hive.pollen-mod.js');


$(function (data) {
    main();
    //while(main());
    close();
});

function main() {
    //make an ajax call to get a param
    var iterations//value will be set by server response
    var key//key of the datastore object
    var continueloop = true;
    p.ajax.post({
        url:'/getdataurl',
        dataType: "json",
        success: function(responseText){
            if (responseText === null) {
                var workermessage = {
                    "log":"responseText is null. Either the server has issues or we have run out of stuff to compute."
                };
                $.send(workermessage);
                continueloop = false;
            }
            iterations = responseText.iterationsjob;
            key = responseText.key;      
        }
    });

    if (continueloop === false) {
        return false;
    }

//here is where I think the problems begin. In chrome/safari, iterations = 1000. 
//In Firefox however, iterations = null. As a result, everything after that does not work.

    var i,x,y,z;
    var count = 0;
    var pi;
    start = new Date();
    for (i=0;i<iterations;i++) {
        x = Math.random();
        y = Math.random();
        z = x*x+y*y;
        if(z<=1.0){
            count++;
        }
    }//end for loop
    pi = count/(iterations)*4.0;
    end = new Date();
    result = {
        "estimated_pi":pi,
        "num_iter":iterations,
        "duration_ms":end.valueOf()-start.valueOf(),
        "key":key
    };
    //send results to the server
    p.ajax.post({
        url: "/resultshandler",
        dataType:'json',
        data: result,
        success: function()
        {
            //do nothing!
        }
    });
    $.send(result);
    return true;//persists the loop
}

1 个答案:

答案 0 :(得分:4)

您正在执行异步XHR,然后立即尝试使用其结果进行循环。我不知道为什么这可能适用于Chrome,但它绝对是活泼的。您是否尝试在帖子选项中传递“sync:true”?

编辑:哦,没关系。我明白为什么你的代码有效。 hive.pollen脚本有这么好的一点:

sync: navigator.userAgent.toLowerCase().indexOf('safari/') != -1 ? false : true,

默认情况下,它在Chrome / Safari中执行同步XHR,在其他所有内容中执行异步操作(因为它将options.sync作为async参数的值传递给XMLHttpRequest.open,它是向后的,但无论如何;它确实意味着你实际上需要在调用点传递sync: false以获得同步行为)。由于您没有指定是要同步还是异步,因此您可以在Chrome中同步并在Firefox中实现异步。

哦,脚本在该行之前有这个精彩的评论:

//  TODO: FIX THIS.