Ajax队列Backbone js

时间:2012-04-03 19:53:20

标签: ruby-on-rails ajax backbone.js ruby-on-rails-3.2

我在Rails 3.2.2上运行Backbone js 0.9.2,我有一个页面用于添加成本行。一个成本有3个TextFields:标题,描述和价格。

我节省了每次模糊费用。

model.save()以非常短的间隔多次调用。其后发出一个create(post)请求,然后发出一个update(put)请求。我遇到的问题是PUT请求有时会在POST之前到达服务器,结果是模型被创建并持续两次(重复)。

要节省模糊是请求的行为,所以我需要一种方法来排队请求。 我已经阅读了有关Spine js的内容,并且他们通过某种队列来解决它。我也看了this,但似乎无法解决这个问题。

感觉这应该是一个常见问题,使用“单页应用程序”但无法找到任何相关内容。

2 个答案:

答案 0 :(得分:9)

您可以覆盖save方法并使用deferred object创建一个队列。例如,

var MDef = Backbone.Model.extend({
    url: "/echo/json/?delay=3",

    initialize: function() {
        this.queue = $.Deferred();
        this.queue.resolve();
    },

    save: function(attrs,options) {
        var m = this; 
        console.log("set "+JSON.stringify(attrs));

        // this.queue = this.queue.pipe with jquery<1.8
        this.queue = this.queue.then(function() {
            console.log("request "+JSON.stringify(attrs));
            return Backbone.Model.prototype.save.call(m, attrs, options);
        });            
    }
});

var m = new MDef();
m.save({title: "a title"});
m.save({description: "a description"});
m.save({price: "a price"});

小提琴:http://jsfiddle.net/nikoshr/8nEUm/

答案 1 :(得分:3)

来自underscore.js的用户debounce

  

创建并返回传递函数的新debounced版本,该函数将推迟执行,直到自上次调用后经过等待毫秒为止。

这样,它只会在最后一次blur事件后触发一次。