多个AJAX调用出现索引问题

时间:2019-03-03 05:50:10

标签: javascript ajax closures

我有一个特定的代码体系结构,请求是在循环中执行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
      });
}
.
.

2 个答案:

答案 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