2011-12-16 13 views
0

最新のWebkitベースのブラウザ(http://montecarlo-tester.appspot.com/)でうまく動作するWebアプリケーションがあります。基本的にWebワーカーを使用してサーバーからデータを取得し、計算を実行した後にそのデータを送信します。WebワーカーがFirefoxとWebkitで動作が異なる

Chrome/Safariではうまくいきますが(コンソールでエラーはありません)、Firefoxで使用しようとするとうまく動作しません。私は、Firefoxで変数 'iterations'が正しく設定されていないことをどうにか推測しました。残念なことに、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 
} 
+2

あなたは[Firebugの](http://getfirebug.com)しようとしたことがあり、 "残念ながら、Firefoxはデバッガを欠い":

ああ、およびスクリプトは、その行の前に、この素​​晴らしいコメントを持っていますか? –

+2

'var iterations'と' var key'のコメントの前に変数名の後ろにセミコロンを置くのは違いますか? – jfriend00

+0

'p.ajax.post'関数は、非同期または同期ajaxを実行していますか? asyncの場合、 'iterations'は成功ハンドラでのみ設定されます.Ajaxコールがまだ完了していないため、' iterations'がまだ設定されていないため、設定する必要はありません。非同期のajax呼び出しを呼び出すだけで操作が開始され、javascriptは実行を継続します。成功ハンドラが実行されると、いつか終了します。 – jfriend00

答えて

4

あなたは、すぐに使用しようとしたループをやって、非同期XHRをやっているの結果。なぜこれがChromeでうまくいくのかわかりませんが、それは間違いなく難しいことです。投稿オプションで「同期:true」を渡してみましたか?

編集:ああ、心配しないでください。なぜあなたのコードが動作するのか分かります。それはへasync引数の値としてoptions.syncを渡すため

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

だからそれは(デフォルトでは、クロム/ Safariで同期XHRと他のすべてで非同期1をやっている:hive.pollenスクリプトはこの素晴らしいビットを持っていますXMLHttpRequest.openですが、これは後方にありますが、実際には同期動作を取得するためにcallsiteでsync: falseを渡す必要があります)。また、同期や非同期を指定する必要がないため、Chromeでは同期が、Firefoxでは非同期になります。

// TODO: FIX THIS. 
+0

ありがとう!私はsync:navigator.userAgent行をコメントアウトし、sync:falseに置き換えました。 Firefoxは今や魅力的に機能します。 – ejang

+0

*代わりに、名前をasync:falseに変更することができ、あなたが言ったようにoptions.syncをoptions.asyncに変更することができます – ejang

+0

それで、私はそのプロジェクトについて長い時間 - (それは、率直に、それは吸うので)是非、ステップを進めて、私はあなたにレポの協力者を作っています。 – Rick

関連する問題