10

我在 Rails 3.2.2 上运行 Backbone js 0.9.2,我有一个添加成本行的页面。成本有 3 个文本字段:标题、描述和价格。

我正在节省模糊的每一项成本。

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

为了节省模糊是请求的行为,所以我需要一种方法来排队请求。我读过一些关于 Spine js 的东西,他们通过某种队列来解决它。我也看过这个,但似乎无法弄清楚。

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

4

2 回答 2

9

您可以覆盖 save 方法并创建一个带有延迟对象的队列。例如,

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/

于 2012-04-04T08:18:24.703 回答
3

debounce来自underscore.js的用户。

创建并返回传递函数的新去抖动版本,该版本将推迟其执行,直到自上次调用以来等待毫秒过去后。

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

于 2012-04-03T20:12:01.197 回答