2011-12-05 7 views
0

私のアプリケーションがしよう: 1.もっと闘争

準備div要素で処理された配列データを挿入する... ...の前に(JSONファイルを使用して) 3. 2.プロセス配列データをいくつかの配列を移入

現在、これは手続き的な方法で構成されていますが、Pointyが指摘しているように(http://stackoverflow.com/questions/8377344/scope-of-javascript-array-differs-from-ie9-to-firefox-chrome/ 8377401#8377401)は、いくつかの非同期プログラミングによってそうしようとしています。私の現在の目標は、すべてのブラウザで適切に非同期にすることで動作させることです。

IE9ではアプリケーションはうまく動作しますが、FFやChromeではうまく動作しません。次の主な手順では、IE9はすべての配列内容を取り込み、保持します。 FFなど、人口はそれを失う。

//globally declare some arrays (used throughout the application) 
function buildTree(id) { 
    $(document).ready(function() { 
     $.getJSON(JSONfile, function(data) { 
      $.each(data.person, function(i, xdata) { 
       //populate arrays with relevant data 
      }); //end of first $.each() 
      //check 1 
     }); //end of first getJSON 
     //check 2 
     $.getJSON(JSONfile, function(data) { 
      //check 3 
      $.each(data.person, function(i, xdata) { 
       //populate arrays with relevant data, using arrays from first read 
      }); //end of second $.each() 
      //check 4 
     }); //end of second getJSON 
     //check 5 
     //check 6 
    }); //end of document.ready 
} 

配列は罰金です:チェック1、3、4、6 配列は空です:私の不幸にパープレキシティを追加するには2、5

をチェックし、私はせずにdiv要素に配列をダンプすることを決定しました処理。私は誤ってアラートを残しました(= check5)。まだ配列が空であることを示していますが、次の行が実行されたとき(配列をDIVにダンプするとき)はすべて問題ありません。アラートをコメントアウトしてください:もう何もありません。

明らかに間違っていますか?

+0

配列は2および5で空です。これらの位置はレディハンドラに属しているからです。 Ajaxレスポンスハンドラ(レディハンドラ内で作成されたAjaxリクエスト)は、レディハンドラの後に*実行されます。 –

+0

2番目の「$」を動かしてみてください。最初の "$ .getJSON()"へのコールバックの中にコード全体を移動させます。あなたが好きであれば、コードクリーナーを少なくして、 "あまりにも"たくさんの機能を追加することができます。 – Pointy

+0

Pointy、これは動作するように見えましたが、DIVを入力するコマンドの直前に警告を出すことに気づきました。私はそれが不適切にフォーマットされたかもしれない - Daveは、これが成功の機能であるべきであることに言及し、おそらく私はコンマか何かが欠けてい $ .each()... }); $ .getJSON()。。 ... }); });。。。 –

答えて

1

あなたはいくつかの選択肢があります。

  1. 第2のJSON Ajaxコールは、最初のsuccess関数で呼び出されます。 ( "check 1")
  2. jQuery's .when/.thenを使用してそれらを積み重ねます。
  3. さらにサーバー側で作業し、すべてのAjaxyを実行しないでください。
  4. 同期させてください(そうしないでください)。
0

あなたのコードの問題は、両方のAJAXリクエストがすぐに送信され、最初のものが2番目のものの前に返されることを保証しないことです。

あなたが最初のものが行われた後にのみ第二AJAX要求を送信

  1. によってこのaroung作業することができ

    $.getJSON(..., function(data1){ 
        $.getJSON(..., function(data2){ 
        }); 
    }); 
    
  2. 明示的にどちらかの要求が最初に来ることを可能に取っ

    //I don't know if there is a function to do this kind of sync 
    // built-in jQuery already. In Dojo I'd use a DeferredList... 
    
    var requests_to_go = 2; 
    var args = []; 
    
    function onHaveAllData(args){ 
        var data1 = args[0]; 
        var data2 = args[1]; 
        //populate second array 
    } 
    
    $.getJSON(..., function(data){ 
        requests_to_go -= 1; 
        args[0] = data; 
        if(request_to_go <= 0){ onHaveAllData(args); } 
    }); 
    
    $.getJSON(..., function(data){ 
        requests_to_go -= 1; 
        args[1] = data; 
        if(request_to_go <= 0){ onHaveAllData(args); } 
    }); 
    
0

これは欺瞞的な質問でした。はい、それは非同期の状況(修正が必要です)がありますが、本当の問題は、なぜ私はFFの警告文で何も見ませんか?現時点では、私は気にしません。なぜなら、FireFoxはアラートに何も表示しなくても、コンテンツを次のルーチンに渡すだけで、次の問題に取り組むからです。

関連する問題