1

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

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
        }

助けてくれてありがとう

4

2 に答える 2

6

問題getJSONは非同期であるようです。実行して終了し、コードが続行されると、データを取得するためのネットワーク操作の開始のみが示されます。実際のネットワーク操作は、しばらくしてから完了します。

完了すると、成功ハンドラーが呼び出され (呼び出しの 2 番目の引数として指定)、配列getJSON()にデータを入力します。timeStampその成功ハンドラーが呼び出された後にのみ、timeStamp配列は有効になります。

timeStampそのため、呼び出しの直後のコードで配列を使用することはできませんgetJSON()(まだ入力されていません)。他のコードで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
}
于 2012-04-19T21:25:14.063 に答える
2

そして、基本的な AJAX を理解していない別の人がいます...

getJSON非同期です。つまり、関数呼び出しの後、JSON 要求が正常に返されるまで、コードは実行され続けます。

リクエストを適切なフラグで強制的に同期させることでこれを「修正」できますが、それは多くの理由で本当に悪い考えです (そのうちの少なくとも 1 つは、A JAX の基本的な考え方に違反しているということです)。最善の方法は、AJAX がどのように機能するかを覚えておき、代わりに、AJAX が返されたときに実行する必要があるすべてのコードを適切な場所に配置することです。

于 2012-04-19T21:25:32.860 に答える