我有一个特定的代码体系结构,请求是在循环中执行AJAX调用。我遇到一个问题,由于循环中进行异步调用,因此循环的索引始终是其最大值。请让我知道实现此关闭的正确方法是什么,以便可以为每个数组值进行调用。
for (ii = 0; ii < 2; ii++) {
ImgViewerNS.init.getJson(ur1mgfeed_array[ii],
function (data){
if (data.d.__count > 0) {
//
//
}
},
ImgViewerNS.init.logError)
}
.
.
.
getJson: function (endpointUri, success, error) {
$.ajax({
url: endpointUri,
type: "GET",
processData: false,
contentType: "application/json;odata=verbose",
headers: {
"Accept": "application/json;odata=verbose"
},
success: success,
error: error
});
}
.
.
答案 0 :(得分:0)
您可以使用async function
async function makeCall() {
for (let ii = 0; ii < 2; ii++) {
await ImgViewerNS.init.getJson(ur1mgfeed_array[ii],
function(data) {
if (data.d.__count > 0) {
//
//
}
},
ImgViewerNS.init.logError)
}
答案 1 :(得分:0)
在for
循环中,使用let
定义ii
变量,使其具有块级作用域而不是函数级作用域。
for (let ii = 0; ii < 2; ii++) {
...rest of your code...
之所以会出现此问题,是因为您在async
循环,for
循环中使用for
函数,或者任何JavaScript代码都不等待async
方法的执行,并且在async
方法到达调用堆栈的时间,闭包引用保留最新值。
您可以参考这篇文章以了解更多信息-https://hackernoon.com/how-to-use-javascript-closures-with-confidence-85cd1f841a6b