0

ここにコードがあります:-

var quiz;
function startQuiz() {

     $.ajax({
        url: 'get_quiz/',
        cache: 'false',
        dataType: 'json',
        async: 'false',
        success: function(data) {
            quiz = data;
            alert(quiz[0].q);   // I'm able to access quiz here     

},   
    }    
);  
    }

startQuiz();

alert(quiz[0].q);   // Not able to access it here.

私はここでクイズにアクセスできません。私は何か使命を持っていますか?, これの何が問題なのですか?

4

4 に答える 4

2

Ajax は非同期であり、なじみのない概念になる可能性があります。コードは次のように実行されます。

1. var quiz;
2. define function startQuiz;
3. call startQuiz;
4. do ajax call (and continue! don't block)
5. alert(quiz[0].q);    // Not able to access it here.
-- ajax call comes back
6. quiz = data;
7. alert(quiz[0].q);       // I'm able to access quiz here

Ajax は非同期であり、ブロックしません。これは、ajax 呼び出しを行うと、ajax 呼び出しが返されるまでコールバックが実際に呼び出されず、ブロックも待機もされないことを意味します。代わりに、コードは続行されます。

その後、ajax 呼び出しがデータを返すと、コールバック関数が実行されます。

Javascript は、イベント ループによってこれを行います。

次のように見てください。ステップ 1 ~ 5 は最初のイベントの一部です。6-7 は 2 番目のイベントの一部です。

JavaScriptの優れた点は、スコープにより、コールバック内でそのにあるもの ( variable など) に引き続きアクセスできることです。quizこれはクロージャーと呼ばれます。あなたのコールバック関数はスコープを閉じて、彼を次のイベントに連れて行きます。

于 2012-04-13T21:23:04.437 に答える
1

AJAX 呼び出しは非同期であるため、結果がサーバーから返されるまで待つ必要があります。すべての作業をコールバック関数で行うか、promise ライブラリ (私はQ promiseライブラリが好きです) を調べると、AJAX の結果を非常に簡単に待つことができます。

于 2012-04-13T21:22:37.383 に答える
0

これは、JavaScript の非同期性によるものです。呼び出すstartQuiz()と実行され、ジャンプして戻り、クイズの alert() が実行されます。

コールバックが呼び出された後、クイズ データに明示的にアクセスして、アクセスできることを確認する必要があります。

実際には同じクイズ変数を変更していない可能性があるため、スコープについても心配する必要があります。

var quiz,
 fetched = false;
$.ajax({
  //blah
 success : function(data){
 fetched = true;
 quiz = data;
}
});

setInterval(function(){
 if(fetched){
 //quiz is populated
  }else{
 //quiz hasn't be populated yet
  }
},50);

startQuiz()巧妙な例ではありませんが、ajax 呼び出しを待たないという点を理解しようとしているだけです。AJAXのAは非同期を意味します。

于 2012-04-13T21:25:57.353 に答える
0

jQuery deferreds を試してみてください。これは、jQuery 1.5 以降の ajax 関連のコードを記述するための推奨される方法です: http://javascriptplayground.com/blog/2012/04/jquery-deferreds-tutorial

こつをつかめば、コードを書いたり理解したりするのが簡単になるかもしれません。

于 2012-04-13T21:47:58.390 に答える