我有一个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'( {
...
}
答案 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
进行迭代。