2012-04-19 27 views
1

クロム開発ツールに基づいてブレークポイント私は把握できる範囲の問題を扱っていると思います。それは私が関数を定義する方法ですか?以下のスクリプトはインクルードjsファイルと配列の 'timeStamp'です。毎回loadData関数を呼び出すことなく、他の関数で使用できるようにしたいと考えています。範囲外のjavascript

timeStamp配列は、関数を終了する前にforループを離れると、未定義になります。

var timeStamp = []; // Want this array to be global 

function loadData (url){ 

     $.getJSON(url, function(json) { 

      for (var i=0;i<json.length;i++){ 
        timeStamp.push(json[i].TimeStamp); 
       } 
        console.log(inputBITS); //returns the value 
      }); 
     console.log(inputBITS); //undefined 
     } 

問題がgetJSONが非同期であるということであるように見えますanyhelp

答えて

6

いただきありがとうございます。コードが実行されて終了し、コードが続行されると、データを取得するためのネットワーク操作の開始のみが示されます。実際のネットワーキング操作は、しばらくしてから完了しません。

完了すると、成功ハンドラが呼び出され(getJSON()コールの2番目の引数として指定されています)、timeStamp配列に値を設定します。成功ハンドラが呼び出された後は、timeStamp配列が有効です。

このように、getJSON()コールの直後にあるコードでtimeStamp配列を使用することはできません(まだ入力されていません)。他のコードにtimeStamp配列が必要な場合は、そのコードを成功ハンドラから呼び出すか、またはtimeStamp配列を使用するコードが成功ハンドラが呼び出されてから使用するまで、他のタイミングメカニズムを使用してコードを使用しないようにする必要があります。配列timeStampが入力されました。

一部のAjax呼び出しを非同期ではなく同期させることは可能ですが、一般的に非常に悪い考えです。これは、ネットワーク操作全体でブラウザーがロックされるためです。非同期ネットワーキングで動作するようにコーディングロジックを修正する方がはるかに優れています。

次のようにこのようなAJAX呼び出しのための典型的なデザインパターンがされています

function loadData (url){ 

    $.getJSON(url, function(json) { 
     // this will execute AFTER the ajax networking finishes 
     var timeStamp = []; 
     for (var i=0;i<json.length;i++) { 
       timeStamp.push(json[i].TimeStamp); 
     } 
     console.log(timeStamp); 
     // now call other functions that need timeStamp data 
     myOtherFunc(timeStamp); 
    }); 
    // this will execute when the ajax networking has just been started 
    // 
    // timeStamp data is NOT valid here because 
    // the ajax call has not yet completed 
    // You can only use the ajax data inside the success handler function 
    // or in any functions that you call from there 
} 
+0

ありがとうございます。成功ハンドラをチェックアウトしようとしています。 – rd42

+1

@ rd42 - 既に成功ハンドラがあります。これは、getJSON呼び出しの第2引数として宣言されている無名関数です。これは、ajax呼び出しが正常に終了したときに呼び出される関数です。これは、Ajaxネットワーキングが完了した後、しばらくして呼び出されます。 – jfriend00

+0

私は少し混乱しています。両方のconsole.logs()は関数内にありますが、1つだけが定義され、2番目のconsole.log()は配列がロードされるまで呼び出されません。 – rd42

2

そして、ここでは基本的なAJAXを理解していない他の人の...

getJSON非同期です。意味、コードは、関数呼び出しの後、そしてJSONリクエストが正常に戻る前に実行され続けます。

あなたは の基本的な考え方に違反しているということです少なくともその(あなたは適切なフラグと同期する要求を強制することで、これを「修正」することができますが、それは多くの理由のために本当に悪い考えですJAX)。最良の方法は、AJAXがどのように動作するのかを覚えておき、AJAXが返すときに実行すべきすべてのコードを適切な場所に配置することです。

+0

ありがとうございました。私はグーグルができる「正しい場所」以外に別の言葉がありますか? – rd42

+1

あなたが定義した無名関数に入れてください。そこには、記録される変数の正しい値が表示されます。 –