【问题标题】:Async call in javascript For Loop not workingjavascript For Loop中的异步调用不起作用
【发布时间】:2021-01-30 12:37:17
【问题描述】:

我在这里的循环中有一个回调函数 for (var res in results) { 但似乎循环没有等待异步调用。当我在这里调用 self.callTestOutputData(test_output_url) 时,循环不会等待响应,而是继续下一次迭代,我丢失了要推送到 obj.requistion_number = testOutputResponse.value; 的值; 请注意:var results = response.results 这里 results 是一个 Json 对象数组。

编辑 1:我尝试了 forEach,但没有成功。

results.forEach(res => {
  var obj = {}
  obj.ferp = res.name;
  // your code...
})

原代码:

self.downloadDailyExcelProcurement = function (filters, excelTmpArr) {
                self.disableExcelDownloadProcurement(true);
                $('.useCaseExcelButtonProcurement .oj-button-button .oj-button-label')[0].style.backgroundColor = "gray";
                $('.useCaseExcelButtonProcurement .oj-button-button .oj-button-label .demo-download-icon-24')[0].style.color = "#D8D8D8";
                var payload = {};
                if (typeof filters === "string") {
                    var fill = filters;
                } else {
                    var fill = self.sendFilters();
                    if(self.app() === "fusion"){
                        fill += '&module=Procurement';
                    }else if (self.app() === "o2r"){
                        fill += '&module=O2r';
                    }
                }
                if(fill.includes("%3A")){
                    fill = fill.replace(/%3A/g, ':');
                }
                payload.Endpoint = 'executions/testcollection/' + fill;
                //console.log(payload.Endpoint)
                payload.BeforeSend = function (xhr) {
                    xhr.setRequestHeader('Authorization', 'Basic ' + btoa('guest:oracle123'));
                    $(".custom-loader-circle").show();
                };
                payload.OnSuccess = function (response) {
                    var results = response.results;
                    for (var res in results) {
                        var obj = {}
                        obj.ferp = results[res].name;
                        obj.po = "NA"
                        obj.receipt_no = "NA"
                        var test_output_url =  results[res].reference_test_cases[0].automation_tests[0].test_outputs[0]
         
                              $.when(self.callTestOutputData(test_output_url)).done(function (testOutputResponse) {
                                  if(testOutputResponse)
                                  obj.requistion_number = testOutputResponse.value;
                                  else {
                                     obj.requistion_number = "NA";
                                  }
                                
                                  self.excelTmpArr().push(obj);
                              });
                         }
                          else {
                             self.excelTmpArr().push(obj);
                        }
                    }
                    if (response.next) {
                        filters = ((response.next).split('testcollection'))[1];
                        if (filters[0] === "/") {
                            var test = filters.slice(1, filters.length);
                        }
                        self.downloadDailyExcelProcurement(test, self.excelTmpArr());
                    } else {
                        if (results.length === 0) {
                            $(".custom-loader-circle").hide();
                            self.disableExcelDownloadProcurement(false);
                            $('.useCaseExcelButtonProcurement .oj-button-button .oj-button-label')[0].style.backgroundColor = "#4d0000";
                            $('.useCaseExcelButtonProcurement .oj-button-button .oj-button-label .demo-download-icon-24')[0].style.color = "white";
                            showMessage(self.messages, "No Data to Download", '', 'info');
                        } else {
                            
                            self.formatForExcel(self.excelTmpArr(), fill, "Procurement");
                        }
                    }
                };
                payload.OnError = function (data) {
                    showMessage(self.messages, data.status, data.statusText, 'error');
                    $(".custom-loader-circle").hide();
                };
                getData(payload);
            }

【问题讨论】:

标签: javascript jquery


【解决方案1】:

尝试使用异步和等待:

async function asyncCall () {
// call here
}

for (var res in results) {
    const response = await asyncCall();
}

【讨论】:

    【解决方案2】:

     var results = response.results;
      if(result.length > 0){
       results.map((data,index)=>{
                        //write your code here
                        }) 
      }
                        

    这会帮助你..

    【讨论】:

      【解决方案3】:

      使用 forEach() 进行迭代,因为它创建了自己的函数闭包:

      results.forEach(res => {
        var obj = {}
        obj.ferp = res.name;
        // your code...
      })

      【讨论】:

      • 这里我收到一个错误:Uncaught TypeError: Cannot read property 'name' of undefined at obj.ferp = results[res].name;
      • 不,我尝试这样做:payload.OnSuccess = function (response) { var results = response.results; results.forEach(res => { var obj = {}; obj.ferp = res.name; // 更多代码但没有用
      • 答案已更新;修改这一行:obj.ferp = res.name;
      • ,我只在上一条评论中尝试过,但没有成功。
      • 试试console.log(res.name),你得到正确的值吗?
      猜你喜欢
      • 2014-10-24
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      相关资源
      最近更新 更多