在下面的代码块中,我需要确保initialize1
和initialize2
对remoteAPIObj
的调用都已完成,然后再渲染我的视图。这两个函数都在执行AJAX查询并执行给定的回调函数。
所以我定义了另一个函数renderOnce
并使用了underscore.js函数after
来确保在实际执行之前实际调用了renderOnce
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();
})
});
答案 0 :(得分: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();
});
如果失败,您还可以使用事件系统触发事件,该事件通知render方法数据可用。但这与你正在做的事情并没有太大的不同。