gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:59:08 24 4
gpt4 key购买 nike

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

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

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

//example array to loop.
var outerQuery= ['A', 'B', 'C', 'D', 'E', 'F'];
var outerQueryLegth = outerQuery.length;
var innerQuery= ['1', '2', '3', '4', '5', '6'];
var innerQueryLegth = innerQuery.length;

//the textarea where im going to print the results in order later to open in excel as a .csv file
var $csvText= $('#some-text-area');

//outter loop
$.each(outerQuery, function(outerIndex, outer){
//Print the row
$csvText.append('Row' + outer +'\r\n\r\n');

//Nested inner loop (that should execute in order regarless or the time of the api call)
innerQuery.reduce(function(innerCallback, inner, innerIndex){
return innerCallback.then(function(){
return GoogleAnalyticsAPI(inner).then(function(response){
$csvText.append(response.column1 +',');
});
});//end inner callback
},Promise.resolve());
});

function GoogleAnalyticsAPI(val) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve({column1: val });
}, Math.floor((Math.random() * 1000) + 1));
});
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<textarea id="some-text-area" rows="20" cols="30"></textarea>

如您所见,代码段中的结果非常奇怪理想情况下,它们应该像这样打印:

RowA
1,2,3,4,5,6
RowB
1,2,3,4,5,6
RowC
1,2,3,4,5,6
.
.
.

我从 Ajax API calls in loop need to be executed in order 得到的 innerQuery.reduce这真的很有帮助,谢谢@jfriend00

谢谢大家

最佳答案

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

这样做的关键是来自先前答案的内部 .reduce() 循环返回一个 promise ,该 promise 仅在内部循环中的所有链式异步操作完成时才得到解决。您可以像这样使用该 promise 来控制和同步外循环:

//example array to loop.
var outerQuery= ['A', 'B', 'C', 'D', 'E', 'F'];
var innerQuery= ['1', '2', '3', '4', '5', '6'];

//the textarea where im going to print the results in order later to open in excel as a .csv file
var $csvText= $('#some-text-area');

//outer loop
outerQuery.reduce(function(outerP, outerItem) {
return outerP.then(function() {
//Print the row
$csvText.append('Row' + outerItem +'\r\n');
return innerQuery.reduce(function(innerP, inner, innerIndex){
return innerP.then(function(){
return GoogleAnalyticsAPI(inner).then(function(response){
$csvText.append(response.column1 +',');
});
});
}, Promise.resolve()).then(function() {
$csvText.append('\r\n\r\n');
});
});
}, Promise.resolve());

function GoogleAnalyticsAPI(val) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve({column1: val });
}, Math.floor((Math.random() * 500) + 1));
});
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<textarea id="some-text-area" rows="20" cols="30"></textarea>

关于javascript - 嵌套循环中的Ajax API调用需要按顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38030502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com