这是一种方法,也是一种常见的解决方案。
从setupResource
调用中返回一个 Promise 将允许延迟视图渲染,直到资源准备好。
您可能还想做的一件事是从您的rendering
方法中触发一个事件来说明视图何时完成渲染:
render: function(){
var listofajaxcall = setupResource(); //returns array of ajax call
var self = this;
$.when(listofajaxcall){
}.done(){
self.rendering();
}
},
rendering: function(){
//do something
// after it's done...
this.trigger("rendered");
}
这样,您可以侦听呈现的事件并调用需要在呈现视图后运行的其他代码。
我更喜欢的另一种方式是在视图之外设置代码,这样视图就不必处理异步代码。
var foo = {
bar: function(){
var listofajaxcall = setupResource();
var self = this;
$.when(listofajaxcall).then(someResource){
var view = new MyView({
someResource: someResource
});
view.render();
$("#whatever").html(view.el);
}
}
}
foo.bar();
在这个版本的代码中,视图对异步一无所知。它是控制应用程序中逻辑流的代码。这样做的缺点是,如果您想在屏幕上显示“正在加载...”消息,您必须先渲染另一个视图。这是值得的 IMO,因为它使正在完成的工作流程更加明确。