由于 $.ajax 返回一个 Promise,因此您可以使用 Promise 链来实现您想要的
var p = $.when();
map.forEach(function(url, key) {
p = p.then(function() {
return log(url);
});
});
function log(url) {
return $.ajax({
url: url,
dataType: 'json',
success: function (result) {
console.log(result.value);
console.log(result.name);
console.log(result.action);
}
});
}
注意:上面的代码仅使用 jQuery,没有原生承诺
或者使用Array的reduce函数
map.reduce(function(p, url) {
return p.then(function() {
return log(url);
});
}, $.when());
如果你可以使用 ES2015+,那么就有原生的 Promises,
map.reduce((p, url) => p.then(() => log(url)), Promise.resolve());
如果你愿意,你也可以这样做
function log(url) {
return $.ajax({
url: url,
dataType: 'json'
});
}
map.reduce((p, url) => p.then(results => log(url).then(result => results.concat(result))), Promise.resolve([]))
.then(results => {
results.forEach(result => {
console.log(result.value);
console.log(result.name);
console.log(result.action);
})
});
区别在于,一旦最后一个请求完成,所有 console.log 都会发生(如果任何失败,则不会发生任何控制台日志)