ОНОВИТИ І ще через два роки це виглядає божевільно, бо прийнята відповідь змінилася на щось набагато краще! (Хоча все ще не так добре, як відповідь Яіра Левіеля за допомогою jQuery when)
Через 18 місяців я просто вдарив щось подібне. У мене є кнопка оновлення, і я хочу, щоб старий вміст, fadeOutа потім новий вміст fadeIn. Але мені також потрібен getновий зміст. А fadeOutта getасинхронні, але запускати їх послідовно було б марною тратою часу.
Те, що я роблю, насправді те саме, що і прийнята відповідь, за винятком форми багаторазової функції. Його головна чеснота полягає в тому, що він набагато коротший за інші пропозиції тут.
var parallel = function(actions, finished) {
finishedCount = 0;
var results = [];
$.each(actions, function(i, action) {
action(function(result) {
results[i] = result;
finishedCount++;
if (finishedCount == actions.length) {
finished(results);
}
});
});
};
Ви передаєте йому масив функцій для паралельного запуску. Кожна функція повинна приймати іншу функцію, якій вона передає свій результат (якщо такий є). parallelзабезпечить цю функцію.
Ви також передаєте йому функцію, яку потрібно викликати, коли всі операції завершені. Це отримає масив з усіма результатами. Таким чином, мій приклад був:
refreshButton.click(function() {
parallel([
function(f) {
contentDiv.fadeOut(f);
},
function(f) {
portlet.content(f);
},
],
function(results) {
contentDiv.children().remove();
contentDiv.append(results[1]);
contentDiv.fadeIn();
});
});
Отже, коли натискається моя кнопка оновлення, я запускаю fadeOutефект jQuery, а також власну portlet.contentфункцію (яка виконує асинхронізацію get, створює новий біт вмісту та передає його далі), а потім, коли обидва завершуються, я видаляю старий вміст, додаю результат другої функції (яка входить results[1]) та fadeInнового змісту.
Оскільки fadeOutнічого не передає своїй функції завершення, results[0]імовірно, містить undefined, тому я ігнорую це. Але якби у вас було три операції з корисними результатами, кожна з них вставляла б resultsмасив у тому ж порядку, в якому ви передавали функції.