我有像下面这样的数据和javascript两个循环和ajax来获取数据。这两个循环使用i j值时可以正常工作。但是,如果我在内部循环中添加ajax,请求将不会按顺序进行。我需要在循环序列中获取数据。我们如何才能做到这一点?
var final = {};
final.reports = ['a','b','c']
final.clients = ['x','y']
final.reportDataJson = [];
for(var i=0;i<final.reports.length;i++){
(function(i,reactthis){
for(var j=0;j<final.clients.length;j++){
(function(i,j,final){
console.log(i+" "+j+" "+final.clients[j])
// this shows correct i j values
$.ajax({
url: url,
cache: false,
success: function(html) {
var reportResponse = {
reportname : final.reports[i],
clientname : final.clients[j],
reporthtml : html,
reportgraph : ''
}
final.reportDataJson.push(reportResponse)
//console.log(i,j)
if( i == final.reports.length-1 && j == final.clients.length-1){
console.log(final.reportDataJson);
}
},
error: function(xhr, status, err) {
if( i == final.reports.length-1 && j == final.clients.length-1){
}
}
})
})
}
})(i,final);
}发布于 2017-01-20 18:32:24
您可以使用这样一个事实,即$.ajax通过$.when返回一个Promise,它等待多个Promise并按顺序返回已解析的值!
var final = {};
final.reports = ['a', 'b', 'c'];
final.clients = ['x', 'y'];
final.reportDataJson = [];
$.when.apply($, [].concat.apply([], final.reports.map(function(report) {
return final.clients.map(function(client) {
return $.ajax({
url: url,
cache: false
}).then(function(results) {
var html = results[0];
// results[0] is same as success: html argument
// results[1] is textStatus
// results[2] is jqXHR
return {
reportname: report,
clientname: client,
reporthtml: html,
reportgraph: ''
};
});
})
}))).then(function() {
final.reportDataJson = [].slice.call(arguments);
console.log(final.reportDataJson);
});使用$.when.apply,因为$.when使用参数1..n作为promises
使用[].concat.apply“扁平化”嵌套的.map返回的数组数组
使用原生Promise,这会更容易一些
Promise.all([].concat.apply([], final.reports.map(function(report) {
// code unchanged from above ....
}))).then(function(results) {
final.reportDataJson = results;
console.log(final.reportDataJson);
});Promise.all接受一个promises数组,它的.then回调接收单个参数,即这些promises的结果数组
看在ES2015+的份上
Promise.all([].concat.apply([], final.reports.map(report => final.clients.map(client => $.ajax({
url: url,
cache: false
}).then(([html, status, jqXHR]) => ({
reportname: report,
clientname: client,
reporthtml: html,
reportgraph: ''
})))))).then(results => console.log(final.reportDataJson = results));https://stackoverflow.com/questions/41760651
复制相似问题