带有for循环的AJAX Done()函数

时间:2013-09-08 19:17:15

标签: javascript jquery ajax for-loop

我有一个for循环,遍历3个值(不同的报告号)的数组,并为每个值发送一个AJAX请求。我希望.done()函数对于返回的每个报表的行为都不同。但是,我不确定如何使完成功能可以使用报告编号。如果我没有将报告号作为参数传递给done()函数,那么它总是认为报告号是'190',即数组中的最后一个值。如果我确实将其传入,如下所示,则显示为未定义。

function runQueries(request, data) {
    var reports = ['103', '187', '190'];
    for (i=0; i < reports.length; i++) {
        var report = reports[i];
        $.ajax({
        url: request + '&reportType=' + report},
        data: data
        })
        .done(function(response, textStatus, jqXHR, report) {
            if (report === '187') {
            ...
            }
            else if (report === '190'( {
            ...
            }

2 个答案:

答案 0 :(得分:1)

问题report的变化比您的请求更快完成。你可以通过一个闭包避免这种情况。请记住,这不会按顺序发生。

var reports = [ 1, 2, 3 ];

for( var i = 0; i < reports.length; i++ ){
    var report = reports[i];
    console.log(report);
    (function(report){
        $.ajax({
            url: '/echo/html',
        }).done(function(){
            switch( report ){
                case 3: console.log('Three!'); break;
                case 2: console.log('Two!'); break; 
                case 1: console.log('One!'); break;
            }
        });
    })(report);
}

这是一个小提琴:http://jsfiddle.net/2ArxZ/

如果您不想在循环中创建函数,可以使用它然后在循环中调用它。

function getReport( report ){
  return function(){
    $.ajax({
        url: '/echo/html',
    }).done(function(){
        switch( report ){
            case 3: console.log('Three!'); break;
            case 2: console.log('Two!'); break; 
            case 1: console.log('One!'); break;
        }
    })();
  }
}

您也可以简单地使用$.each,但理解闭包有很多帮助,所以我走了很长的路!

答案 1 :(得分:0)

关闭和范围:

function runQueries(request, data) {
    var reports = ['103', '187', '190'];
    for (i=0; i < reports.length; i++) {
        (function(report) {
            $.ajax({
                url: request + '&reportType=' + report},
                data: data
            }).done(function(response) {
                if (report === '187') {
                      ...
                } else if (report === '190'( {
                      ...
                }
            });
         })(reports[i]);
    }
}

done()方法是异步的,所以在触发时,循环已经很久了。

您也可以使用$.each进行迭代。