我正在嘗試使用牽線木偶插件將骨幹應用程序放在一起,並且遇到了一些問題,使得初始化程序以我期望的方式工作。我有以下代碼:如何處理骨幹牽線木偶初始化程序中的異步代碼
var MyApp = new Backbone.Marionette.Application();
MyApp.addRegions({
region1 : '#div1',
region2 : '#div2'
});
MyApp.Resources = { };
MyApp.bind('initialize:before', function (options) {
// display a modal dialog for app initialization
options.initMessageId = noty({
text : 'Initializing MyApp (this should only take a second or two)',
layout : 'center',
speed : 1,
timeout : false,
modal : true,
closeOnSelfClick : false
});
});
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;
console.log(MyApp.Resources.urls); // <- THIS returns an object
}
});
});
MyApp.bind('initialize:after', 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); // <- THIS returns 'undefined' BEFORE the console.log in the initializer above
});
注意在上面的代碼中,我有兩個console.log
電話,一個在初始化,以及一個在initialize:after
處理。兩者都記錄相同的對象屬性。正如你所看到的,我正在經歷的是initialize:after
handler中的console.log
調用在之前被調用在初始化器的success
處理程序中。我意識到這是因爲初始化程序中有一個異步調用...我需要知道的是,如何在應用程序中執行其他任何操作之前,確保初始化程序中的所有異步代碼都已完成?這是否有一個好的模式?我沒有在文檔中找到任何指示如何正確處理這個問題。
謝謝。
現在看到這個答案的書面形式,對我來說似乎很明顯,我覺得有點愚蠢,我無法自己弄清楚。謝謝Derick。 – 2012-07-16 17:17:58
沒有什麼愚蠢的。這是不明顯的,如果你不知道答案:) – 2012-07-16 21:25:04
我在想這個,並愚蠢的谷歌搜索它。但是你發佈的語法有助於澄清我的想法;)感謝Derick回覆並感謝OP提出問題! – jkat98 2013-07-23 15:36:28