Вопрос

У меня есть этот код в настоящее время:

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

Как я могу изменить это так, чтобы уничтожение только запускало только после того, как произошли все транзакции ajax? Если бы у меня был один предыдущий запрос Ajax, я бы просто использовал успех: параметр, но я не могу этого сделать здесь.

Как правильно сделать это в основе?

Это было полезно?

Решение 3

Одним из возможных решений было бы создать пользовательский метод API, который принял транзакции в качестве параметров и выполнял задание на стороне сервера. Это уменьшит HTTPS -запросы, а также повысит производительность.

Другие советы

Model.save Верните объект XHR, используемый в запросе. С jQuery 1.5 эти объекты отсроченные объекты Вы можете использовать для создания механизма синхронизации.

Например,

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

У меня нет опыта работы с магиной, но я бы подошел к этой проблеме так:

  • Получите количество Active_transactions.
  • На Transaction.save () проверьте количество обработанных транзакций (в успехе и/или обратном вызове ошибок), если он соответствует количеству Active_transactions, затем уничтожьте модель.

Просто следите за количеством уже обработанных транзакций и запустите уничтожение в последнем обратном вызове, как SO:

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

}

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top