2015-04-08 3 views
1

Вот код, который берет модель Backbone, сохраняет ее, а затем ждет ответа и запускает код jQuery .done() или .fail(). Это работает нормально, но в противном случае мы действительно хотим, чтобы возвращаемое сообщение из службы добавило его в наш объект ошибок. Все это находится в функции проверки подлинности Backbone validate(); после этого кода мы проверяем объект errors и выводим сообщение, если оно есть.Как продолжить выполнение JS после deferred.fail()

Кажется, что если мы .fail(), все перестает выполняться. Нам нужно продолжить проверку. Я нашел этот вопрос/ответ, но, похоже, это не изменило ситуацию: Is there a way to continue after one deferred fails?

Любой способ продолжить выполнение кода после нажатия на deferred.fail()?

addressModel.save().done(function() { 
    console.log("promise done"); 
    model.set("...", false); 
}).fail(function(response) { 
    console.log("promise fail"); 
    if (response.responseJSON && response.responseJSON._messages) { 
     _.each(response.responseJSON._messages, function(value, key) { 
      errors[key] = value[0]; 
     }); 
    } 
}); 
+0

http://stackoverflow.com/questions/28131082/jquery-ajax-prevent-fail-in-a-deferred-sequential-loop/? – guest271314

ответ

1

Это возможно, но сложно - по крайней мере, до 3,0. Уловка:

  • Не использовать .fail.then.
  • Возврат разрешенного отсрочки с отказа.

Это как сигнал, что мы имели дело с исключением мы получили здесь:

var p = addressModel.save().then(function() { 
    console.log("promise done"); 
    model.set("...", false); 
}, function(response) { 
    console.log("promise fail"); 
    if (response.responseJSON && response.responseJSON._messages) { 
     _.each(response.responseJSON._messages, function(value, key) { 
      errors[key] = value[0]; 
     }); 
    } 
    return $.Deferred().resolve(); // return a resolved deferred 
}); 

Это позволит вам сделать:

p.then(function(){ 
    // this code runs when either failure or success happened, can also chain 
}); 
+0

Мне любопытно - версия 3.0 чего? –

+1

Из jQuery. Я могу найти соответствующую фиксацию, если вам интересно. –

+0

Я протестировал это, и он действительно работает, но для приложения потребуется немного больше кода для нескольких компонентных файлов. Я не могу выразить все это в функции 'then()', и ничего кроме этой функции не выполняется .... –

0

Мы никогда не могли бы получить эту работу с обещание, было ли оно возвращено функцией внутри Backbone's validate() или самой validate(). Но я нашел решение внутри самой Backbone - save() примет async: false и выполнит срыв до получения ответа, затем продолжите оттуда. Вероятно, он использует обещание сделать это за кулисами.

addressModel.save(null, { 
    async: false, 
    success: function() { 
     model.set("...", false); 
    }, 
    error: function(model, response) { 
     if (response.responseJSON && response.responseJSON._messages) { 
      _.each(response.responseJSON._messages, function(value, key) { 
       errors[key] = value[0]; 
      }); 
     } 
    } 
}); 
Смежные вопросы