2012-01-26 11 views
1

以下のコードブロックでは、remoteAPIObjへのinitialize1initialize2の呼び出しが両方とも終了していることを確認する必要があります。どちらの関数もAJAXクエリを実行しており、与えられたコールバック関数を実行します。レンダリング前にコールバックまで待機する

だから私は別の関数renderOnceを定義し、renderOnceを確認する機能after underscore.js使用していたが、実際に実際に実行される前に2回呼び出されます。このアプローチに欠けていることはありますか?それとも他の提案がありますか?

window.MyView = Backbone.View.extend({ 
    el: $('#right-container'), 
    render: function(eventName) { 
     var template = Handlebars.compile($("#right-template").html()); 
     $(this.el).html(template(remoteAPIObj.getData())); 

     return this; 
    }, 
    initialize: _.once(function() { 
     var self = this; 
     remoteAPIObj.initialize1(function(){self.renderOnce();}); 
     remoteAPIObj.initialize2(function(){self.renderOnce();}); 
    }), 
    renderOnce: _.after(2, function() { 
     this.render(); 
    }) 
}); 

答えて

1

jQueryを使ってこれを行うための理想的な方法でアプローチを約束 - http://api.jquery.com/jQuery.when/

例:

$.when($.ajax("test.aspx")).then(function(ajaxArgs){ 
    alert(ajaxArgs[1]); /* ajaxArgs is [ "success", statusText, jqXHR ] */ 
}); 

をあなたの内部コードが約束に適合させることができる場合は、この

ような何かを行うことができます
$.when(remoteAPIObj.initialize1, remoteAPIObj.initialize2).then(function(args1, args2){ 
    this.render(); 
}); 

これに失敗すると、イベントシステムを使用してデータが使用可能であることをレンダリングメソッドに通知するイベントです。しかし、これはあなたがすでにやっていることとはまったく違うことはありません。

+0

$ .whenがinitialize1と2の両方のコールバックが実行されるまで待たずに済むように、私はそれらを内部で操作しなければならないと思います。 – osoner

+0

あなたがそれを遅延オブジェクトにすると、それが両方を待つことを確かめてください。いくつかのテスト用Ajaxコードで試してみるのは簡単です。 – JohnP

+0

initialize1とinitialize2の中にreturn $ .ajax({...})を使用すると、$が実際に作った – osoner

関連する問題