ОБНОВЛЕНИЕ И еще два года спустя это выглядит безумно, потому что принятый ответ изменился на что-то намного лучшее! (Хотя все еще не так хорошо, как ответ Яира Левиеля, используя 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();
});
});
Поэтому, когда нажимается моя кнопка обновления, я запускаю эффект jQuery fadeOut
, а также мою собственную функцию portlet.content
(которая выполняет асинхронную get
, создает новый бит контента и передает его), а затем, когда оба завершены, я удаляю старый контент, добавляю результат второй функции (которая находится в results[1]
) и fadeIn
новый контент.
Поскольку fadeOut
ничего не передает в функцию завершения, results[0]
предположительно содержит undefined
, поэтому я игнорирую это. Но если бы у вас было три операции с полезными результатами, каждый из них помещал бы в массив results
, в том же порядке, в котором вы передавали функции.