веб-работники ведут себя иначе, чем Firefox - PullRequest
0 голосов
/ 16 декабря 2011

У меня есть веб-приложение, которое прекрасно работает в современных браузерах на основе webkit (http://montecarlo -tester.appspot.com / ).В основном он использует веб-работник для извлечения данных с сервера, а затем отправляет их обратно после выполнения некоторых вычислений.

Он отлично работает в Chrome / Safari (без ошибок в консоли), но при попытке использовать егов Firefox это не так.Я сделал вывод, что каким-то образом переменная 'iterations' не установлена ​​должным образом в Firefox.К сожалению, в Firefox отсутствует отладчик (для веб-работников), а в 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 Ответ

4 голосов
/ 16 декабря 2011

Вы выполняете асинхронный XHR, а затем сразу делаете цикл, пытаясь использовать его результаты.Я понятия не имею, почему это возможно работает в Chrome, но это определенно чудовищно.Вы пробовали передать "sync: true" в опциях своего сообщения?

Редактировать: О, неважно.Я понимаю, почему ваш код работает.Сценарий hive.pollen имеет такой замечательный бит:

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

Так что он выполняет синхронизацию XHR в Chrome / Safari и асинхронную во всем остальном по умолчанию (потому что он передает options.sync в качестве значения дляаргумент async для XMLHttpRequest.open, который задом наперед, но не имеет значения; это означает, что вам действительно нужно передать sync: false на месте вызова для получения поведения синхронизации).И поскольку вы не указываете, хотите ли вы синхронизировать или асинхронно, вы получаете синхронизацию в Chrome и асинхронность в Firefox.

О, и у сценария есть замечательный комментарий перед этой строкой:

//  TODO: FIX THIS.
...