将延迟对象(jqxhr)分配给模型或集合

时间:2013-01-03 15:56:05

标签: jquery backbone.js jquery-deferred

我正在开发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() );
  }
} 

这个想法是,如果请求已经完成,它将立即执行,如果没有,它将等待。但至少我从节省时间中受益,直到达到这一点。

这是个好主意吗?

1 个答案:

答案 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);您必须使用完整/成功/错误回调。