Магистраль _.
-
25-10-2019 - |
Вопрос
У меня есть этот код в настоящее время:
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();}});
}
}
});
}
);
}