 <blockquote> <p>how can I make sure that all of the async code in my initializer(s) is complete before doing anything else in the application?</p> </blockquote> <p>Don't use the <code>initialize:after</code> event. Instead, trigger your own event from the <code>success</code> call, and then bind your app start up code from that one.</p> <pre><code>MyApp.addInitializer(function (options) { $.ajax({ url: options.apiUrl + '/my-app-api-module', type: 'GET', contentType: 'application/json; charset=utf-8', success: function (results) { MyApp.Resources.urls = results; // trigger custom event here MyApp.vent.trigger("some:event:to:say:it:is:done") } }); }); // bind to your event here, instead of initialize:after MyApp.vent.bind('some:event:to:say:it:is:done', function (options) { // initialization is done...close the modal dialog if (options.initMessageId) { $.noty.close(options.initMessageId); } if (Backbone.history) { Backbone.history.start(); } console.log(MyApp.Resources.urls); }); </code></pre> <p>This way you are triggering an event after your async stuff has finished, meaning the code in the handler will not run until after the initial async call has returned and things are set up.</p>