有以下情况:
我必须显示给定间隔的图形(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
我读到了延迟和承诺,但我发现很难在动态天数和顺序获得响应的要求
由于
答案 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和递归的组合。查看此示例代码,看看它是否有助于澄清事情:
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;
如果您需要更多说明,请告诉我,很乐意提供帮助!
答案 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
})