在异步代码块中处理的多个ajax延迟调用的数组,后跟同步最终代码块

时间:2015-11-18 04:08:14

标签: javascript jquery ajax jquery-deferred

我是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调用数组一起使用中间处理的示例

解决这个问题的好方法是什么?

谢谢!

2 个答案:

答案 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");
  });