来自客户端的并行异步Ajax调用

时间:2019-02-09 04:05:49

标签: ajax asp.net-mvc

我在客户端中有20个数据包,我正在通过Ajax帖子一一推送到服务器。每次通话大约需要一分钟才能产生响应。有什么办法可以使这些请求中的几个并行运行。

我用过Jquery promise。但是,仍然等待上一个请求完成的请求。

var dataPackets=[{"Data1"},{"Data2"},{"Data3"},{"Data4"},{"Data5"}, 
                 {"Data6"},{"Data7"},{"Data8"},{"Data9"},{"Data10"},
                 {"Data11"},{"Data12"},{"Data13"},{"Data14"},{"Data15"},{"Data16"}, 
                 {"Data17"},{"Data18"},{"Data19"},{"Data20"}];

$(dataPackets).each(function(indx, request) {

  var req = JSON.stringify(request);

  setTimeout({

    $.Ajax({
      url: "sample/sampleaction",
      data: req,
      success: function(data) {
        UpdateSuccessResponse(data);
      }

    });
  }, 500);
});

2 个答案:

答案 0 :(得分:1)

jQuery中的when ... done构造可并行运行ops。

$.when(request1(), request2(), request3(),...)
  .done(function(data1, data2, data3) {});

这是一个例子: http://flummox-engineering.blogspot.com/2015/12/making-your-jquery-ajax-calls-parallel.html

答案 1 :(得分:0)

$。when.apply($,functionArray)使您可以放置​​可以并行运行的函数数组。该函数数组可以动态创建。实际上,我这样做是根据单选按钮列表中选中的项目将网页导出为PDF。

这里我创建一个空数组,var functionArray = [];然后根据选定的项目,将函数推到数组f = createPDF(checkedItems [i] .value)

$(document).ready(function () {           
    });
    function sleep(milliseconds) {
       var start = new Date().getTime();
       for (var i = 0; i < 1e7; i++) {
           if ((new Date().getTime() - start) > milliseconds){
               break;
           }
       }
    }
    function exportPDFCollection() {
        var f = null;
        var x = 0;
        var checkedItems = $("input:checked");
        var count = checkedItems.length;

        var reportList = $(checkedItems).map(
             function () { 
                 return $(this).next("label").text();
             })
            .get().join(",");

        var functionArray = [];
        var pdf = null;
        for (var i = 0; i < count; i++) {              
            f = createPDF(checkedItems[i].value)   
                    .done(function () {
                        pdf = checkedItems[x++].value;
                        alert('PDF =>  ' + pdf + ' created.');                            
                    })
                    .fail(function (jqxhr, errorText, errorThrown) {
                        alert('ajax call failed');
                    });
            functionArray.push(f);
        }
        $.when.apply($, functionArray)
        .done(function () {
            $.get("http://yourserver/ExportPage.aspx",{reports: reportList})
                .done(function () {                    
                       alert('PDF merge complete.');
                 })
                 .fail(function (jqxhr, errorText, errorThrown) {
                        alert('PDF merge failed.  Please try again.');
                 });                
            return true;
        });
    }        
    function createPDF(webPage) {
        return $.get(webPage);                
    }