Frage

Ich habe diesen Code derzeit:

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

Wie kann ich dies so ändern, dass die Zerstörung nur dann auslöst, sobald alle _.ach Ajax -Transaktionen stattfinden? Wenn ich eine frühere AJAX -Anfrage hätte, würde ich nur den Erfolg verwenden: Parameter, aber das kann ich hier nicht.

Was ist der richtige Weg, dies im Rückgrat zu tun?

War es hilfreich?

Lösung 3

Eine mögliche Lösung wäre, eine benutzerdefinierte API -Methode zu erstellen, die die Transaktionen als Parameter verwendet und den Job auf der Serverseite erledigt hat. Dies würde HTTPS -Anfragen verringern und die Leistung erhöhen.

Andere Tipps

Modell.Save Geben Sie das in der Anforderung verwendete XHR -Objekt zurück. Mit JQuery 1.5 sind diese Objekte aufgeschobene Objekte Sie können einen Synchronisationsmechanismus erstellen.

Zum Beispiel,

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

Ich habe keine Erfahrung mit Backbone, aber ich würde dieses Problem so angehen:

  • Holen Sie sich die Anzahl der Active_Transactions.
  • Überprüfen Sie bei Transaction.save () die Anzahl der verarbeiteten Transaktionen (im Erfolg und/oder Fehler -Rückruf), wenn sie mit der Anzahl der Active_transactions übereinstimmt, dann zerstören Sie das Modell.

Behalten Sie einfach die Anzahl der bereits verarbeiteten Transaktionen im Auge und lösen Sie die Zerstörung im letzten Rückruf aus:

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

}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top