现象:js中如果在for循环中调用ajax并传入参数,由于ajax的异步问题会导致传入的参数的值一直是最后赋予的值。
例如:
function batch_deploy () {
for(var i=0;i<5;i++){
//给传入ajax的变量赋值
var num=i;
$.ajax({
url: "wapi/v1.0/test",
async: true,//异步
type: "GET",
contentType: "application/json",
dataType: "json",
success: function (rtnVal) {
save(num);
}
});
}
}
我所期待的结果的是每次调用save方法时传入的参数是随i递增的,实际结果是每次传入的值都是 4;造成这种结果是因为ajax的异步导致,如果ajax设置成同步则没有这种问题,但效率会非常低下。
解决方法:使用闭包,在ajax调用时使内部函数保持对外部函数变量的引用。
function batch_deploy () {
for(var i=0;i<5;i++){
//给传入ajax的变量赋值
var num=i;
(function(rd){//形参
$.ajax({
url: "wapi/v1.0/test",
async: true,//异步
type: "GET",
contentType: "application/json",
dataType: "json",
success: function (rtnVal) {
save(rd); //形参
}
});
})(num);
}
}
此时,每次调用save方法时每次传入的参数都是实际递增的值