依次执行ajax请求的动态数量

时间:2016-04-12 11:06:43

标签: javascript jquery ajax jquery-deferred

有以下情况:

我必须显示给定间隔的图形(startDate,endDate)

因为间隔可能很大,所以我需要每天检索数据 按顺序执行多个ajax调用并将数据附加到图形(highcharts)

示例间隔为n天==>

ajax request day 1 

when is (done) ready ajax request day 2

when is (done) ready ajax request day 3

....

ajax request day n

我读到了延迟和承诺,但我发现很难在动态天数和顺序获得响应的要求

由于

4 个答案:

答案 0 :(得分:2)

如果您能够在数组中存储日期列表,则可以使用以下内容:

var items = ['Apple', 'Orange', 'Banana', 'Alphalpha'];

//replaceable with any function that returns a promise
function asyncFunction(item) { 
  return $.ajax({
    url: '/echo/html',
    type: 'POST',
    data : item
  })
  .then(function(data){
    $('body').append('<div>Got the response from '+item+'</div>');
    //stuff stuff stuff
  });
}

function sequence(arr, callback) {
  var i=0;

  var request = function(item) {

    return callback(item).then(function(){

      if (i < arr.length-1)
            return request(arr[++i]);

    });
  }

  return request(arr[i]);
}

sequence(items, asyncFunction).then(function(){
    $('body').append('<div>Done with all!</div>');
});

https://jsfiddle.net/7ojy9jnx/2/

基本上,sequence接受一个Array项并在所有项上运行一个函数(在本例中为asyncFunctions,可以用任何函数替换),这是一个返回的函数承诺。

这是非常基本的实现,您会注意到,例如,它没有错误处理。像async.js这样的库有一个完整的工具列表来完成这样的任务,但谁知道,也许这就足够了。

答案 1 :(得分:1)

不确定你是否已经弄清楚了,但解决问题的一个好方法是使用jQuery.Deferred和递归的组合。查看此示例代码,看看它是否有助于澄清事情:

&#13;
&#13;
function getData(dayLimit) {
  var allDone = $.Deferred();

  var getDataForDay = function(day) {
    doAsyncThing(day).done(function() {
      if (day < dayLimit) {
        getDataForDay(day + 1);
      } else {
        allDone.resolve();
      }
    }).fail(function(){
      /*
        Reject the deferred if one of your operations fails.
        Useful if you're binding "fail" or "always" callbacks
        to the promise returned by getData.
      */
      allDone.reject();
    });
  };

  getDataForDay(1); //start with first day

  return allDone.promise();
}
&#13;
&#13;
&#13;

如果您需要更多说明,请告诉我,很乐意提供帮助!

答案 2 :(得分:0)

递归调用怎么样?创建参数化函数并将日期传递给函数,如

function getDetails(day){

//  ajax call
//  In the callbacks call the getDetails function by updating the date

}

答案 3 :(得分:-1)

如果您在应用程序中使用Jquery,请尝试将所有ajax推送到数组

离 [AJAX,AJAX,...]

然后是用户

$.when([ajax,ajax,...]).then(function(){
 console.log(arguments);// you will get the success messages in arguments array 
})