私は、バック・ボーン・アプリケーションをmarionetteプラグインを使ってまとめようとしていますが、イニシャライザが期待通りの動作をするのに問題があります。私は2つのconsole.log
呼び出し、初期化子内の1つの、そしてinitialize:after
ハンドラで1を持っている上記のコードでバックボーン・マリネット・イニシャライザで非同期コードを処理する方法
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
});
注:私は、次のコードを持っています。どちらも同じオブジェクトプロパティを記録します。ご覧のとおり、initialize:after
ハンドラのconsole.log
コールがと呼び出されてから、の前に、イニシャライザのsuccess
ハンドラが呼び出されています。これは、イニシャライザが非同期呼び出しを持っていることに気付いています。私が知る必要があるのは、アプリケーション内で何かをする前に、イニシャライザ内のすべての非同期コードが完了していることを確認する方法です?これには良いパターンがありますか?私はこれを正しく処理する方法を示す文書では何も見つかりませんでした。
ありがとうございました。
私はちょっと愚かではないと感じましたが、私は自分自身でそれを理解することができませんでした。ありがとうDerick。 –
何もそれについて愚かではない。あなたが答えを知らないと明らかではありません:) –
私はこれを考えていて、それをグーグルで愚かに感じました。あなたが投稿した構文が私の考えを明確にするのに役立った;)質問に答えるための応答と感謝のためのDerickありがとう! – jkat98