2
var questions = [];
$(document).ready(function() { 

$.ajax({
    type:"GET",
    url:"question.xml",
    dataType: "xml",
    success: function(data) {

        $(data).find('item').each(function() {

            var question = $(this).find('question').text();
            var answer = $(this).find('qid').text();
            var opt1 = $(this).find('ans1').text();
            var opt2 = $(this).find('ans2').text();
            var opt3 = $(this).find('ans3').text();
            var opt4 = $(this).find('ans4').text();

            questions.push({'question':question, 'answer':answer, 'opt1':opt1, 'opt2':opt2, 'opt3':opt3, 'opt4':opt4});
        });
        alert(questions.length); // here it shows length as 20
    }
});
alert(questions.length); // here it shows length as 0 });

グローバル (質問) として宣言された配列があります。問題は、ajax 成功の内部で配列にアクセスすると 20 個の要素があるのに、アクセスしようとすると配列の長さが 0 になることです。

誰かが私が間違っていることを説明できますか。

4

3 に答える 3

1

$.ajax は非同期です。

最後の行のアラートは、質問がプッシュされる前に実行されました。

于 2013-08-17T06:44:44.920 に答える
0

$.ajax は Web サーバーへのリクエストをキューに入れ、すぐに返します。

したがって、データの準備が整う前に下部アラートが実行されます。

データの準備ができると、success 関数が実行され、データが表示されます。

成功関数で、または成功関数から呼び出して、データの処理を行う必要があります。

非同期呼び出しからの応答を返すにはどうすればよいですか? を参照してください。確認と追加の議論のために。

于 2013-08-17T06:44:15.247 に答える
0

Ajax は非同期です。これは、ブラウザに ajax リクエストを実行するように命令すると、スクリプトはすぐに残りのスクリプトを続行することを意味します。ajax リクエストが完了すると、ajax 呼び出しの成功ハンドラーが呼び出されます。最初に届きます

alert(questions.length); // here it shows length as 0

そして、あなたのajax呼び出しのページが最終的にロードされると、それが実行されます

alert(questions.length); // here it shows length as 20

ajax 呼び出しの結果に対してアクションを実行する必要がある場合は、すべて成功ハンドラーで実行する必要があります。

于 2013-08-17T06:45:24.483 に答える