2012-02-10 9 views
4

私はこれについて間違った方法をとっていると思います。これは私がRequireJSまたはLABjsを使用する代わりにやろうとしているものです:遅延オブジェクトが拒否される原因は何ですか?

var APP = {}; 
APP._timers = {}; 
APP._timelines = {}; 

$.when(
    $.getScript('/app/models/Timer.js'), 
    $.getScript('/app/models/Section.js'), 

    $.getScript('/app/collections/Timers.js'), 
    $.getScript('/app/collections/Sections.js'), 

    $.getScript('/app/views/SectionView.js'), 
    $.getScript('/app/views/APPView.js'), 

    $.Deferred(function(deferred){ 
     $(deferred.resolve); 
    }) 
).done(function() { 
    alert('done'); 
    console.log(APP.APPView); 
    var foo = new APP.APPView; 
    APP._timelines.main = new APP.Timers('main'); 
    APP._timelines.branched = new APP.Timers('branched'); 
}).fail(function(){ 
    alert('failed'); 
}); 

それはfailedを警告されて、何もコンソールに書き込まされていません。

これらのファイルのいずれかを開くと、ファイルの上部または下部に何かを警告すると、それが表示されます。 、私は延期あなたdomReadyの実装についてはよく分からない

APP.APPView = Backbone.View.extend({ 
    el : $("#app-view"), 
    initialize : function() { 
     alert('App view initialized'); // Never gets called 
     this.sectionVew = new APP.SectionView(); 
    } 
}); 
alert('Inside APPView.js'); // gets called 
+1

'alert( 'fail');' console.log(arguments) 'のようなものを入力して、問題の詳細を返すことができますか? –

+0

なぜあなたはすぐにそれ自体を解決する遅延を作成していますか? –

+0

@JohnFlatness DOMReadyイベントが発生した場合、または既に存在する場合は直ちに解決されます。 –

答えて

2

これが失敗する理由は、あなたのスクリプトをすべて$.whenの中に依存関係を管理せずに読み込もうとしているからだと思います。 $.getScriptはそれぞれ非同期であり、順序通りに完了する必要はありません。したがって、未定義のモデルを使用しようとすると、モデルの実行が停止する前にビューがロードされます。 要するに、これを行うには、次のいずれかを行う必要があります。

  1. 依存関係を手動で管理します。すなわちモデルがロードされると、次にビューがロードされる。
  2. trully独立型モジュールを書く
  3. これは最も簡単ですが、手動ですべてを行い、require.jsなどのAMDローダーを使用しないようにしてください。これがそこにある理由です。
+1

あなたが正しいです、私の依存関係の1つがロードされていない時間内に上記のコメントから、私の未定義の関数エラーを指摘した 'console.log(arguments)'に言ったJames Khouryの功績を認めなければなりません。ありがとう! – Maverick

1

このようにそれを試してみてください:ここでは、そのファイルの例です

var APP = {}; 
APP._timers = {}; 
APP._timelines = {}; 

var domRdyDeferred = $.Deferred(); 
$(domRdyDeferred.resolve); 

$.when(
    $.getScript('/app/models/Timer.js'), 
    $.getScript('/app/models/Section.js'), 

    $.getScript('/app/collections/Timers.js'), 
    $.getScript('/app/collections/Sections.js'), 

    $.getScript('/app/views/SectionView.js'), 
    $.getScript('/app/views/APPView.js'), 

    domRdyDeferred 
).done(function() { 
    alert('done'); 
    console.log(APP.APPView); 
    var foo = new APP.APPView; 
    APP._timelines.main = new APP.Timers('main'); 
    APP._timelines.branched = new APP.Timers('branched'); 
}).fail(function(){ 
    console.log(arguments); 
    alert('failed'); 
}); 

彼らは完了していないかもしれないけれども注意することが重要ですあなたがそれらを追加する順序で$.when

+0

あなたの答えをありがとう。私はhttp://www.bennadel.com/blog/2124-Using-Deferred-Objects-As-An-Asynchronous-Script-Loader-In-jQuery-1-5.htmから遅延DOMレディハンドラのアイディアを得ました – Maverick

+0

ああ、私はそのポストを覚えています!彼の最新の投稿はこれにも役立つかもしれません。 http://www.bennadel.com/blog/2326-jQuery-whenSync-Plugin-For-Chaining-Asynchronous-Callbacks-Using-Deferred-Objects.htm –

関連する問題