Вот хороший пример на es5, без Promise и async/await если Вам это важно:
var result = {};
deferredParallel([1, 2, 3, 4, 5], function (id) {
return $.ajax({
url: urlToCreated + '/' + id,
method: 'GET',
dataType: 'json',
data: {
skip: skip,
limit: 100000
},
success: function (data) {
result[id] = data;
}
});
}).done(function () {
console.log(result);
});
function deferredParallel(items, callback) {
var deferreds = [];
for (var i = 0; i < items.length; i++) {
var deferred = callback(items[i], i, items);
if (typeof deferred === 'object' && deferred.done && deferred.fail) {
deferreds.push(deferred);
}
}
return $.when.apply(null, deferreds);
}
А вот рабочий пример, который вы можете запустить в консоли, например даже тут на тостере:
var result = [];
deferredParallel([1, 2, 3, 4, 5], function (item) {
return $.ajax({
url: 'https://jsonplaceholder.typicode.com/posts/' + item,
method: 'GET',
dataType: 'json',
success: function (data) {
result.push(data);
}
});
}).done(function () {
console.log(result);
});
function deferredParallel(items, callback) {
var deferreds = [];
for (var i = 0; i < items.length; i++) {
var deferred = callback(items[i], i, items);
if (typeof deferred === 'object' && deferred.done && deferred.fail) {
deferreds.push(deferred);
}
}
return $.when.apply(null, deferreds);
}
Пример выше делал запросы паралельно, в network это выглядит так:
▮▮▮▮
▮▮▮▮
▮▮▮▮
□□□□□□ READY
Следующий пример последовательный:
▮▮▮
□□□□□▮▮▮
□□□□□□□□□□▮▮▮
□□□□□□□□□□□□□□□ READY
var result = [];
deferredQueue([1, 2, 3, 4, 5], function (item) {
return $.ajax({
url: 'https://jsonplaceholder.typicode.com/posts/' + item,
method: 'GET',
dataType: 'json',
success: function (data) {
result.push(data);
}
});
}).done(function () {
console.log(result);
});
function deferredQueue(items, callback) {
var ready = $.Deferred();
;(function fire (i) {
var deferred = callback(items[i], i, items);
if (typeof deferred === 'object' && deferred.done && deferred.fail) {
deferred.done(function () {
items[i + 1] ? fire(++i) : ready.resolve();
});
}
}(0));
return ready;
}