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

3

jQuery getJSON 调用是异步的,这意味着调用是在后台执行的。所以你调用 $.getJSON 会立即返回。

您必须为 getJSON 提供一个“就绪函数”(请参阅​​文档),该函数在 AJAX 调用返回时被调用。

或者(尽管我不建议这样做),您可以强制 jQuery 进行同步 AJAX 调用,它会在继续之前等待回复。查看 jQuery 文档。

高温高压

于 2013-08-29T11:21:03.983 回答
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 回答
1

AJAX 默认异步运行

您的 AJAX 函数以异步方式运行,因此它们不会中断您的 JavaScript 代码流。这意味着他们发送请求,然后等待响应并处理您在success函数中放入的任何内容。一直以来,其余代码一直在运行。

您最好的选择可能是将您对 AJAX 返回所做的任何事情从for循环中取出,并将其传递给success您的 AJAX 查询的参数,如下所示:

$.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 回答
0

您需要使 ajax 调用同步才能使用它。使用以下代码:

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

我认为您正在寻找的是同步调用。在这里查看答案:getJSON Synchronous

默认情况下,getJSON 异步执行,这意味着代码继续执行而不等待响应。

于 2013-08-29T11:23:15.760 回答
0

由于$.getJSON是异步的,我认为您需要采用另一种方法。

像这样的东西:

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

function getAnswers() {
    var ret = false;
    $.ajax({
        url: "getAnswers?question_id=" + questionId,
        dataType: 'json',
        async: false,
        success: function (data) {
            ret = "success";
        }
    });
    return ret;
}

这样,您将强制 jQuery 同步运行您的请求代码。

于 2013-08-29T11:24:13.543 回答
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 回答