我们有一个可怕的异步情况,而我们需要某些AJAX请求才能在路由器激发它的路由之前完成。确保AJAX请求在发射Backbone中的路由之前完成
如何确保在骨干路由器触发任何路由之前某些AJAX请求已被触发?
更多的是我知道的概念性问题,但任何建议表示赞赏!
我们有一个可怕的异步情况,而我们需要某些AJAX请求才能在路由器激发它的路由之前完成。确保AJAX请求在发射Backbone中的路由之前完成
如何确保在骨干路由器触发任何路由之前某些AJAX请求已被触发?
更多的是我知道的概念性问题,但任何建议表示赞赏!
@nikoshr是正确的。
另一种方法是阻止点击事件的自动路由,然后在ajax响应完成时手动触发route
事件。
$.when(xhr1, xhr2).then(function() {
router.trigger("route", "route-name", any_args);
});
路线将触发只有当Backbone.history.start
叫做:
开始Backbone.history.start
当你所有的路由器已创建([选项]),以及所有路由正确设置,调用Backbone.history.start()开始监视hashchange事件,并调度路由。
这意味着您可以通过在进行此调用之前等待完成Ajax请求来实现您的目标。
假设你使用jQuery> = 1.5为你的选择和你的Ajax请求的模型获取,您可以使用Deferred objects通过model.fetch
返回同步动作$:
var Router = Backbone.Router.extend({
routes: {
'': 'index'
},
index: function() {
console.log('route')
}
});
var M = Backbone.Model.extend({
url: '/echo/json/?delay=1'
});
var r = new Router();
var m1 = new M();
var m2 = new M();
var xhr1 = m1.fetch(),
xhr2 = m2.fetch();
$.when(xhr1, xhr2).then(function() {
console.log('requests');
Backbone.history.start();
});