我该怎么做才能避免同步AJAX请求

时间:2018-02-23 15:10:35

标签: javascript jquery ajax

我有这个数组

var testFlows = ["test1","test2","test3","test4","test5"];

我正在尝试逐个获取输入并生成一些html(生成的html并不重要)。

重要的是我希望按照testFlows数组的顺序看到这个html面板。我的代码是完全随机的。如果我刷新页面,他们就会处于不同的位置。

一种解决方案是制作同步ajax,但它已弃用且不好,我还能做些什么呢?

代码:

 var testFlows = ["test1","test2","test3","test4","test5"];

  $.each(testFlows, function (index, testFlow) {
            //get the inputs
            $.ajax({
               url: '/flow/getInputs',
               type: 'post',
               data: {testCaseName: testFlow.testCase.name},
               success: function (inputNames) {
                   testCaseAccordion = '<div class="panel panel-default"><div class="panel-heading"><h4 class="panel-title"><a class="collapseTitle" data-toggle="collapse" data-parent="#accordion" href="#collapse-' + testFlow.testCase.name + index + '">' + testFlow.testCase.name + '(' + testFlow.testCase.type.name + ') <span id="eyeIcon" class="fas fa-eye float-right"></span></a></h4></div>';
                   testCaseAccordion += '<div id="collapse-' + testFlow.testCase.name + index + '" class="panel-collapse collapse"><div id="panel-body-' + testFlow.testCase.name + index + '" class="panel-body"></div></div>';
                   $('#accordion').append(testCaseAccordion);
                   if (testFlow.params !== null) {
                       var inputs = testFlow.params.split(',');
                       for (var i = 0; i < inputs.length; i++) {
                           $('#panel-body-' + testFlow.testCase.name + index).append('<strong class="color-red">' + inputNames[i] + ': </strong>' + inputs[i] + '<br>');
                       }
                   }
                   else {
                       $('#panel-body-' + testFlow.testCase.name + index).append("This test case doesn't have any inputs");
                   }
               }
            });

        });

2 个答案:

答案 0 :(得分:1)

例如,您可以使用承诺:

var testFlows = ["test1","test2","test3","test4","test5"];

function success(testFlowAndInputNames, index) {
    var testFlow = testFlowAndInputNames[0];
    var inputNames = testFlowAndInputNames[1];
    var testCaseAccordion = '<div class="panel panel-default"><div class="panel-heading"><h4 class="panel-title"><a class="collapseTitle" data-toggle="collapse" data-parent="#accordion" href="#collapse-' + testFlow.testCase.name + index + '">' + testFlow.testCase.name + '(' + testFlow.testCase.type.name + ') <span id="eyeIcon" class="fas fa-eye float-right"></span></a></h4></div>';
    testCaseAccordion += '<div id="collapse-' + testFlow.testCase.name + index + '" class="panel-collapse collapse"><div id="panel-body-' + testFlow.testCase.name + index + '" class="panel-body"></div></div>';
    $('#accordion').append(testCaseAccordion);
    if (testFlow.params !== null) {
        var inputs = testFlow.params.split(',');
        for (var i = 0; i < inputs.length; i++) {
            $('#panel-body-' + testFlow.testCase.name + index).append('<strong class="color-red">' + inputNames[i] + ': </strong>' + inputs[i] + '<br>');
        }
    }
    else {
        $('#panel-body-' + testFlow.testCase.name + index).append("This test case doesn't have any inputs");
    }
}


var arrayOfPromises = testFlows.map(function (testFlow) {
    return new Promise(function (resolve, reject) {
        $.ajax({
            url: '/flow/getInputs',
            type: 'post',
            data: {testCaseName: testFlow.testCase.name},
            success: resolve
        });
    })
    .then(function(inputNames) { 
        return [testFlow, inputNames];
    })
});

Promise.all(arrayOfPromises)
    .then(function(results) {
        results.forEach(success)
    });

答案 1 :(得分:0)

jQuery ajax返回一个promise,因此您可以将所有promises保存到数组中,例如:

var testFlows = ["test1", "test2", "test3", "test4", "test5"];

var testFlowsPromises = $.map(testFlows, function(testFlow, index) {
  //get the inputs
  return $.ajax({
    url: '/flow/getInputs',
    type: 'post',
    data: {testCaseName: testFlow.testCase.name}
  }).then(function(inputNames) {
    return {
      inputNames: inputNames,
      testFlow: testFlow
    };
  });
});

然后,等到所有这些都完成了:

$.when.apply($, testFlowsPromises).done(function() {
  $.each(arguments, function(index, data) {
    // do stuff with index, data.inputNames, data.testFlow
  });
});

现在你有一个以相同顺序的ajax数据数组。

<强>样本

https://jsbin.com/fixuxezale/edit?js,console