Backbone _.each AJAX依赖项

时间:2011-11-29 12:57:11

标签: javascript jquery backbone.js underscore.js

我目前有这个代码:

handleSubmit: function(e)
{
    var to_bucket = this.$('.transaction_bucket').val();

    // Move all the transactions for this bucket to the selected bucket
    window.app.model.active_transactions.each(
        function(transaction)
        {
            transaction.set({bucket_id: to_bucket});
            transaction.save();
        }
    );

    this.model.destroy({success: function() { window.app.model.buckets.fetch();}});
}

我如何修改它,以便只有在所有_.each ajax事务发生后才会触发destroy?如果我之前有一个ajax请求,我只会使用success:参数,但我不能在这里做。

在骨干网中做到这一点的正确方法是什么?

4 个答案:

答案 0 :(得分:1)

model.save返回请求中使用的xhr对象。使用jQuery 1.5,这些对象是deferred objects,您可以使用它们来构建同步机制。

例如,

var to_bucket = this.$('.transaction_bucket').val(), 
    calls=[],
    mdestroy=this.model.destroy;

window.app.model.active_transactions.each(function (transaction) {
    transaction.set({bucket_id: to_bucket});
    calls.push(transaction.save());
});

$.when.apply($, calls).then(function () {
    mdestroy({success: function () {window.app.model.buckets.fetch();}});
});

答案 1 :(得分:0)

我对骨干没有经验,但我会像这样处理这个问题:

  • 获取active_transactions的数量。
  • 在transaction.save()上,检查已处理事务的数量(在成功和/或错误回调中),如果它与active_transactions的数量匹配,则销毁该模型。

答案 2 :(得分:0)

一种可能的解决方案是创建一个自定义API方法,该方法将事务作为参数并在服务器端完成工作。这样可以减少https请求并提高性能。

答案 3 :(得分:0)

只需跟踪已处理的交易数量,并在上次回调中触发销毁,如下所示:

handleSubmit: function(e)
{
  var to_bucket = this.$('.transaction_bucket').val();
  var remainingTransactions = window.app.model.active_transactions.length;
  var self = this;

  window.app.model.active_transactions.each(
    function(transaction)
    {
        transaction.save({bucket_id: to_bucket}, {
          success: function(){
            remainingTransactions -= 1;
            if(remainingTransactions < 1) {
              self.model.destroy({success: function() { window.app.model.buckets.fetch();}});
            }
          }
        });
    }
  );

}