在Backbone中启动路由之前,请确保AJAX请求已完成

时间:2013-02-26 10:44:18

标签: backbone.js

我们有一个可怕的异步情况,而我们需要在路由器触发它的路由之前完成某些AJAX请求。

如何在Backbone Router触发任何路由之前确保某些AJAX请求已被触发?

我知道更多的概念性问题,但任何建议都表示赞赏!

2 个答案:

答案 0 :(得分:2)

只有在调用Backbone.history.start时才会触发路由:

  

开始 Backbone.history.start([options])
  创建所有路由器并正确设置所有路由后,请调用Backbone.history.start()以开始监视hashchange事件并调度路由。

这意味着您可以在拨打此电话之前等待Ajax请求完成,从而实现您的目标。

假设您使用jQuery> = 1.5作为您的选择,并且您的Ajax请求是模型提取,您可以使用model.fetch返回的Deferred objects来同步您的操作:

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();
});

http://jsfiddle.net/nikoshr/fnsqU/

一起玩的小提琴

答案 1 :(得分:0)

@nikoshr是对的。

另一种方法可能是阻止点击事件的自动路由,然后在完成ajax响应时手动触发route事件。

$.when(xhr1, xhr2).then(function () { 
   router.trigger("route", "route-name", any_args);
});