Pregunta

Tengo este código actualmente:

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

¿Cómo puedo modificar esto para que la destrucción solo se desencadene una vez que todas las transacciones AJAX sucedan? Si tuviera una solicitud AJAX anterior, solo usaría el éxito: el parámetro, pero no puedo hacerlo aquí.

¿Cuál es la forma correcta de hacer esto en la columna vertebral?

¿Fue útil?

Solución 3

Una posible solución sería crear un método API personalizado que tomara las transacciones como parámetros e hiciera el trabajo en el lado del servidor. Esto reduciría las solicitudes HTTPS y aumentaría el rendimiento también.

Otros consejos

modelo. Devuelva el objeto XHR utilizado en la solicitud. Con jQuery 1.5, estos objetos son objetos diferidos Puede usar para construir un mecanismo de sincronización.

Por ejemplo,

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

No tengo experiencia con la columna vertebral, pero abordaría este problema así:

  • Obtenga el número de Active_Transactions.
  • En Transaction.save (), verifique el número de transacciones procesadas (en la devolución de llamada de éxito y/o error), si coincide con el número de Active_Transactions, luego destruya el modelo.

Simplemente realice un seguimiento de la cantidad de transacciones ya procesadas y active la destrucción en la última devolución de llamada así:

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

}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top