Я рекомендую использовать библиотеку Promises .Вы можете взломать простые решения, как предлагают другие ответы, но по мере роста вашего приложения вы обнаружите, что делаете все больше и больше этих взломов.Обещания предназначены для решения подобных проблем при работе с асинхронными вызовами.
В проекте CommonJS есть несколько предложений Обещаний , которые вы должны проверить.Вот вопрос, который я задал на SO об обещаниях некоторое время назад со ссылками на другие решения.Узнайте больше об обещаниях в этом видео Дугласа Крокфорда .В целом видео хорошее, но переходите к обещаниям чуть позже.
В настоящее время я использую библиотеку FuturesJS , поскольку она соответствует моим потребностям.Но есть и преимущества для других реализаций.Это позволяет вам очень легко выполнить sequences
:
// Initialize Application
Futures.sequence(function (next) {
// First load the UI description document
loadUI(next); // next() is called inside loadUI
})
.then(function(next) {
// Then load all templates specified in the description
loadTemplates(next); // next() is called inside loadTemplates
})
.then(function(next) {
// Then initialize all templates specified in the description
initTemplates();
});
Еще более мощным является тот случай, когда вам нужно join
объединить асинхронные события и выполнить другое действие, когда все остальные асинхронные события завершены.Вот пример (не проверенный), который загрузит несколько файлов HTML и затем выполнит действие только после того, как ВСЕ из них завершат загрузку:
var path = "/templates/",
templates = ["one.html","two.html","three.html"],
promises = [];
$.each(templates, function(i,name) {
promises[i] = Futures.promise();
var $container = $("<div>");
$container.load(path+name, function(response,status,xhr) {
promises[i].fullfill();
}
});
Futures.join(promises, {timeout: 10000}) // Fail if promises not completed in 10 seconds
.when(function(p_arr) {
console.log("All templates loaded");
})
.fail(function(p_arr) {
console.log("Error loading templates");
});
Это может быть излишним для вашего приложения.Но если приложение становится все сложнее, использование обещаний поможет вам в долгосрочной перспективе.
Надеюсь, это поможет!