我正在开发Backbone应用程序,而且复杂性正在增长。其中一个副作用是有时页面的初始加载速度很慢。我已将此问题追溯到AJAX请求等待。
在我目前的一些路线中,我正在制作类似于4个单独请求的内容。有些是重要的,如加载模板。因此我使用jQuery ajax请求中的done()函数来传递继续加载页面的回调。
有时我需要一个小的无关紧要的元素的数据。例如,加载最近5篇博文的请求。 现在我的想法是,我想尽快提出请求而不停止其余路线的执行,我想知道什么时候准备就绪。
所以这是我的建议
var myModel = new Posts(); //instantiate the model
myModel.dfd = myModel.fetch();
然后在处理最后一个posts元素的子视图中有了传递模型的方法并执行类似的操作
render : function() {
var self = this;
this.model.dfd.done(function( ) {
this.html( template( self.model.toJSON() );
}
}
这个想法是,如果请求已经完成,它将立即执行,如果没有,它将等待。但至少我从节省时间中受益,直到达到这一点。
这是个好主意吗?
答案 0 :(得分:0)
这将完全奏效,这是利用$.Deferred
的一个很好的例子......但是还有另一种方法可以考虑:首先让请求同步。
Fetch将其选项传递给$.ajax
,$.ajax
获取“异步”参数,该参数控制请求是同步还是异步。这意味着,如果你这样做:
self.model.fetch({async: false});
// self.model will already be fetched by the time this next line runs
this.html( template( self.model.toJSON());
无论哪种方式都很有效恕我直言;哪种风格只是一种偏好。
P.S。关于后一种风格的一个小注意事项是,如果你尝试将它与$ .Deferred结合起来可能会有问题。来自jQuery网站:
从jQuery 1.8开始,不推荐使用async:false和jqXHR($ .Deferred);您必须使用完整/成功/错误回调。