ОНОВИТИ І ще через два роки це виглядає божевільно, бо прийнята відповідь змінилася на щось набагато краще! (Хоча все ще не так добре, як відповідь Яіра Левіеля за допомогою 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
масив у тому ж порядку, в якому ви передавали функції.