Javascript 嵌套循环中的Ajax API调用需要按顺序执行

Javascript 嵌套循环中的Ajax API调用需要按顺序执行,javascript,jquery,ajax,promise,jquery-deferred,Javascript,Jquery,Ajax,Promise,Jquery Deferred,假设您有一个场景,需要在页面的文本区域中创建.csv输出 所以我有两个数组,我循环嵌套在另一个数组中。嵌套循环的结果是通过ajax调用传递的查询。。。我需要将ajax调用的结果附加到textarea中 我的问题是,如何按照请求的顺序(基本上是查询数组中的顺序)打印结果 //循环的示例数组。 var outerQuery=['A','B','C','D','E','F']; var outerQueryLegth=outerQuery.length; var innerQuery=['1','2

假设您有一个场景,需要在页面的文本区域中创建.csv输出

所以我有两个数组,我循环嵌套在另一个数组中。嵌套循环的结果是通过ajax调用传递的查询。。。我需要将ajax调用的结果附加到textarea中

我的问题是,如何按照请求的顺序(基本上是查询数组中的顺序)打印结果

//循环的示例数组。
var outerQuery=['A','B','C','D','E','F'];
var outerQueryLegth=outerQuery.length;
var innerQuery=['1','2','3','4','5','6'];
var innerQueryLength=innerQuery.length;
//文本区域,我将在其中打印结果,以便稍后在excel中以.csv文件的形式打开
var$csvText=$(“#一些文本区域”);
//外环
$.each(outerQuery,函数(outerIndex,outer){
//打印该行
$csvText.append('Row'+outer+'\r\n\r\n');
//嵌套内部循环(应按regarless顺序或api调用时间执行)
reduce(函数(innerCallback、inner、innerIndex){
返回innerCallback.then(函数(){
返回GoogleAnalyticsAPI(内部)。然后返回(函数(响应){
$csvText.append(response.column1+',');
});
});//结束内部回调
},Promise.resolve());
});
函数GoogleAnalyticsAPI(val){
返回新承诺(函数(解析){
setTimeout(函数(){
解析({column1:val});
},数学地板((数学随机()*1000)+1));
});
}

您可以使用,以与数组中的索引相对应的顺序返回函数

//循环的示例数组。
var outerQuery=['A','B','C','D','E','F'];
var outerQueryLegth=outerQuery.length;
var innerQuery=['1','2','3','4','5','6'];
var innerQueryLength=innerQuery.length;
var$csvText=$(“#一些文本区域”);
//创建“outerQuery”队列
$csvText.queue(“outerQuery”,$.map(outerQuery,函数(外部,索引)){
返回函数(下一步){
$(此).append((索引>0?'\r\n\r\n':“”)
+'行'+outer+'\r\n\r\n')
//创建“innerQuery”队列
.queue(“innerQueue”,$.map(innerQuery,函数(inner,innerIndex)){
返回函数(下一步){
返回GoogleAnalyticsAPI(内部)。然后返回(函数(响应){
$csvText.append(response.column1+',');
//在“innerQueue”中调用“下一步”函数`
})。然后(_next);
}
})).dequeue(“innerQueue”).promise(“innerQueue”)
//在“outerQueue”中调用“next”函数`
//当前'innerIndex'中的所有函数`
//对于`innerQueue`数组,`innerQueue`完成
.然后(下一个)
}
})).dequeue(“outerQuery”);
函数GoogleAnalyticsAPI(val){
返回新承诺(函数(解析){
setTimeout(函数(){
决心({
第1栏:val
});
},数学地板((数学随机()*1000)+1));
});
}

您可以继续使用在内部
上使用的相同逻辑。reduce()
循环,并将其应用于外部循环。此外,您可以使用普通Javascript概念进行同步

实现这一点的关键是,前面答案中的内部
.reduce()
循环返回一个承诺,该承诺仅在内部循环中的所有链式异步操作完成时才得到解决。您可以使用该承诺控制和同步外部循环,如下所示:

//循环的示例数组。
var outerQuery=['A','B','C','D','E','F'];
var innerQuery=['1','2','3','4','5','6'];
//文本区域,我将在其中打印结果,以便稍后在excel中以.csv文件的形式打开
var$csvText=$(“#一些文本区域”);
//外环
reduce(函数(outerP,outerItem){
返回outerP.then(函数(){
//打印该行
$csvText.append('Row'+outerItem+'\r\n');
返回innerQuery.reduce(函数(innerP、inner、innerIndex){
返回innerP.then(函数(){
返回GoogleAnalyticsAPI(内部)。然后返回(函数(响应){
$csvText.append(response.column1+',');
});
});
},Promise.resolve())。然后(function()){
$csvText.append('\r\n\r\n');
});      
});
},Promise.resolve());
函数GoogleAnalyticsAPI(val){
返回新承诺(函数(解析){
setTimeout(函数(){
解析({column1:val});
},数学地板((数学随机()*500)+1));
});
}


FYI,名为
innerCallback
的参数根本不是回调。这是一个承诺,将其称为回调实际上会模糊代码的工作方式。与前一个问题一样,您正在尝试使用同步循环结构迭代异步内容(在本例中为
$。each()
。你不能那样做。谢谢你,伙计!你真是一张王牌!坦斯克兄弟,在你帮了我两次前几次之后,我真的尝试过这种方法,但我错在退货中…我需要对此进行润色…但真的很感谢你的帮助,我成功地完成了我现在需要的工作。。。