1

関数が呼び出される for ループがあります。その関数には AJAX 呼び出しがあります。ajax が終了すると、for ループに値が返されます。次に、 for ループのみを続行する必要があります。

for ( var j = 0; j < req.questionId.length; j++) {

    var getanswer = getAnswers();
}

function getAnswers(){

    $.getJSON("getAnswers?question_id="+questionId,function(data){

           return "success";
    });

}
4

8 に答える 8

1

AJAX はデフォルトで ASYNCHRONOUSLY を実行します

AJAX 関数は非同期で実行されるため、JavaScript コードのフローを中断しません。これが意味することは、リクエストを送信し、レスポンスを待って、success関数に入力したものを処理するということです。その間ずっと、残りのコードは実行され続けます。

あなたの最善の選択肢は、おそらく次のように、AJAX リターンで行っていることをすべてforループから取り出し、それをsuccessAJAX クエリのパラメーターに渡すことです。

$.getJSON("getAnswers?question_id="+questionId,function(data){
    ... handle data, parse it, write to page etc ...
});

別の呼び出し構文を使用して、AJAX を同期的に実行することもできますが、ここからでも、それから抜け出すのに苦労するでしょうreturn

$.ajax({
    dataType: "json",
    url:      url,
    data:     data,
    success:  success,
    async:    false
});

あなたのコードとリターンで何をしているのかをもっと知らなければ、これにどのようにアプローチするべきかははっきりとは言えませんが、あなたがやっている方法でAJAXリクエストを実行する100回のうち99回はソフトウェアが貧弱です.エンジニアリング。

于 2013-08-29T11:25:37.147 に答える
1

$.ajax()次のように、同期的に呼び出しを行う必要があります。

for ( var j = 0; j < req.questionId.length; j++) {

    var getanswer = getAnswers();
}

function getAnswers(){
    var result;
    $.ajax({
      url: "getAnswers?question_id="+questionId,
      dataType: 'json',
      async: false,
      success: function(data) {
         result="success";
      }
    });
    return result;
}
于 2013-08-29T11:18:25.487 に答える
0

それを使用するには、ajax 呼び出しを同期化する必要があります。次のコードを使用します。

$.ajaxSetup({
        async: false
    });
于 2013-08-29T11:22:57.487 に答える
0

あなたが探していると思うのは、同期呼び出しです。ここで答えを確認してください: getJSON 同期

デフォルトでは、getJSON は非同期で実行されます。つまり、コードの実行は応答を待たずに続行されます。

于 2013-08-29T11:23:15.760 に答える
0

ソリューションの抽象的な実装は次のようになります

getAnswers(array, complete) {
    if (array.length == 0) {
        complete();
    }

    var questionId = array.shift()
    $.getJSON("getAnswers?question_id=" + questionId, function (data) {
        //do what ever you want to do with data

        //call the next question
        processQuestions(array, complete)
    });
}

getAnswers(req.questionId, function(){
    //do something when all questions are completed
})
于 2013-08-29T11:39:14.597 に答える
0

for ループを利用するには、呼び出しを同期させる必要があります。これは、要求の間、ページがハングしているように見えるため、お勧めできません。

代わりに、非同期呼び出しが終了した後に成功コールバックとして呼び出される再帰関数を使用します。

// declare in global
var req.questionId = "";
var index = 0;

// declare your recursive function call
function recursiveFunction()
{
    if(index > req.questionId) return false;

    // call your ajax here using global index variable
}

// your ajax function call
function ajaxCall
{
    $.ajax({
    url: "getAnswers?question_id=" + questionId,
    dataType: 'json',
    success: function (data) {
        ret = "success";

        // call your recursive function here
        recursiveFunction();
    }
});
}

現在、ajax 呼び出しは非同期であり、for ループは再帰呼び出しによって実装されています。

それが役立つことを願っています。

于 2013-08-29T11:39:47.383 に答える