2

これは私を夢中にさせています。Firebugでステップスルーすることもできません。誰かがここで何が起こっているのか説明してもらえますか?

基本的に、各行にパイプ区切りのレコードが含まれる着信テキスト ファイルがあります。後でオートコンプリート テキスト ボックスで使用するために、これらを文字列の配列の配列に分割しています。コードは次のとおりです。

<script type="text/javascript">
$(function () {

    var rawData = new Array();
    $.get("/sample.txt",
        function (data) {
            var raw = data.split('\n');
            for (var i = 0; i < raw.length; i++) {
                rawData.push(raw[i].split('|'));
            };
            alert(rawData); // 1st sanity check
        }
    );
    alert(rawData); // 2nd sanity check
    alert(rawData); // 3rd sanity check

なんらかの理由で、最初のサニティ チェックは正常に機能します。期待どおりにすべてのデータが表示されます。2 つ目は rawData が空であることを示していますが、3 つ目はすべてのデータを再度表示しています。最初の健全性チェックを削除しても、2 番目と 3 番目には影響しません。

これはどのように可能ですか?これはなぜですか?これは私を夢中にさせています。

4

1 に答える 1

5

get() 関数が非同期関数であることを忘れています。内部で定義したコールバックは、ファイルがロードされた後にのみ呼び出されます。基本的に、JavaScript インタープリターは、アクションが完了したときに備えて、それをキューに入れ、残りのコードを実行できるようにします。

したがって、コールバックのアラートには、ファイルがロードされたという事実が反映されます。外部のアラートは、そのファイルがロードされるかなり前に実行されます。もちろん、個人的に 2 番目のアラートを無視するのを長く待つほど、すべてのデータがロードされたときに 3 番目のアラートが実行される変更が改善されます。

于 2011-06-09T02:14:36.637 に答える