我是jquery和ajax的新手,我正在尝试使用延期和承诺的概念来解决我遇到的这个问题。 我想做以下事情: 调用URLS列表并处理从URL返回的结果。我想先并行处理结果,然后结合处理后的结果给出最终结果。
伪代码如下:
var deferredAjaxCalls = [];
for (var i = 0; i < jobsListLength; i++) {
deferredAjaxCalls.push(
$.ajax({
url:"/myurl",
method:"POST",
contentType:"application/json",
dataType:"json",
data:mydata,
success:function(result){
//Some code here that is performance intensive
}
});
}
$.when.apply(this,deferredAjaxCalls).done(function(){
for (var k=0; k< arguments.length;k++){
//combine the results of the individual results of the
// success part of all the ajax calls and execute some more
//code synchronously
}
}).fail( function (jqXHR, status, error) {
//Log failed status
});
最初,我从$ .when.apply()中的成功部分移动了所有代码。但是,这导致了非常慢的性能,因为现在有很多密集计算同步执行。所以我正在寻找一种独立执行部分代码的方法,以及同步的最终部分
我确实读过关于使用promises的内容,但是在最终在when.apply()块中进行同步之前找不到promises与ajax调用数组一起使用中间处理的示例
解决这个问题的好方法是什么?
谢谢!
答案 0 :(得分:0)
从数组<Grid Width="48" Height="48">
<Path Fill="{DynamicResource CurrentColor}"
Stretch="Uniform"
Data="M23,12L19,8V11H10V13H19V16M1,18V6C1,4.89 1.9,4 3,4H15A2,2 0 0,1 17,6V9H15V6H3V18H15V15H17V18A2,2 0 0,1 15,20H3A2,2 0 0,1 1,18Z" />
</Grid>
开始,你可能想要这样的东西:
jobsList
答案 1 :(得分:-1)
您可以尝试使用延迟:
var req_responses = [];
var deferreds = [];
for(var i in jobs) {
deferreds[i] = new $.Deferred();
}
for(var i in jobs) {
(function(i) {
$.ajax ({
url: ".",
type: "POST",
dataType: "json",
done: function(response) {
//process the response
req_responses[i] = response;
deferreds[i].resolve();
}
});
})(i);
}
$.when.apply(deferreds).then(function(os) {
//all the responses are in req_responses
//finish processing
alert("done");
});