函数完成后继续FOR循环

时间:2013-08-29 11:14:09

标签: javascript ajax jquery

我有一个调用函数的for循环。在该函数中,我有一个AJAX调用。在ajax完成后,它返回一个值给for循环。那么只有循环必须继续。

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

    var getanswer = getAnswers();
}

function getAnswers(){

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

           return "success";
    });

}

8 个答案:

答案 0 :(得分:3)

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

你必须为getJSON提供一个“ready-function”(参见文档),这是在返回AJAX调用时调用的。

或者(虽然我会反对它),你可以强制jQuery进行同步AJAX调用,它会在继续之前等待回复。查看jQuery文档。

HTH

答案 1 :(得分: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;
}

答案 2 :(得分:1)

AJAX默认运行ASYNCHRONOUSLY

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

你最好的选择是可能来接受你在for循环中返回的AJAX所做的一切,并将其传递给你的AJAX查询的success参数,像这样:

$.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
});

在不了解您的代码以及您正在使用返回的内容的情况下,我无法确定您应如何处理此问题,但是在您执行此操作的方式中,有99次运行AJAX请求软件工程很差。

答案 3 :(得分:0)

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

$.ajaxSetup({
        async: false
    });

答案 4 :(得分:0)

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

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

答案 5 :(得分: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同步运行你的请求代码。

答案 6 :(得分: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
})

答案 7 :(得分: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循环是通过递归调用实现的。

希望有所帮助。