我在客户端中有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);
});
答案 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);
}