异步ajax处理for循环的Javascript闭包

异步ajax处理for循环的Javascript闭包,javascript,ajax,reactjs,asynchronous,Javascript,Ajax,Reactjs,Asynchronous,我有如下数组 var clients = ['a','b']; var reports = ['x','y','z']; var finalData = []; 现在我需要这样的循环 for(var i=0;i<reports.length;i++){ var response = {report : reports[i]} for(var j=0;j<clients;j++){ response.client = clients[i]; $.

我有如下数组

var clients = ['a','b'];
var reports = ['x','y','z'];
var finalData = [];
现在我需要这样的循环

for(var i=0;i<reports.length;i++){
   var response = {report : reports[i]}
   for(var j=0;j<clients;j++){
       response.client = clients[i];
      $.ajax({
        url :url,
        success : function(data){
          response.data = data;
          finalData.push(response);
        })
     });
   }
}
您必须为响应变量保存作用域(使用colsure),请尝试以下操作:

for(var i=0;i<reports.length;i++){
   var response = {report : reports[i]}
   for(var j=0;j<clients;j++){
      response.client = clients[i];

      (function(responce){
      $.ajax({
        url :url,
        success : function(data){
          response.data = data;
          finalData.push(response);
        })
      })(responce);

     });
   }
}
要解决这个问题,需要有一个范围来保存i的值,这样当超时结束时,它可以找到i的正确值,称为闭包:

for(var i=0;i<5;i++){
  (function(i){
    setTimeout(function(){
      console.log(i);
      console.log("....");
    }, 1000)
  })(i);
}
或者,您可以检查是否为所有客户端加载了所有报告,然后更新状态:

// total can be calculated by num of reports X number of clients
if(finalData.length == total){
  this.setState({data: finalData})
}

您可以使用闭包来保留报告和客户机值。有关更多详细信息,请参见此示例代码中的多个编码错误。e、 g.
客户机[i]
应该是
客户机[j]
for(var i=0;i<5;i++){
  (function(i){
    setTimeout(function(){
      console.log(i);
      console.log("....");
    }, 1000)
  })(i);
}
var that = this; // to be added in top of the 2 for loops
finalData.push(response);
this.setState({data: finalData})
// total can be calculated by num of reports X number of clients
if(finalData.length == total){
  this.setState({data: finalData})
}