BackboneJS не может перейти на.fail, когда таймаут вызова API

Я новичок в позвоночнике. Я нашел код, который добавляет Deferred, чтобы мы могли добавить обещание. Это код

getPatientInfo: function fetch(options) {
   var deferred = $.Deferred();
   Backbone.Model.prototype.fetch.call(this, _.extend({ 
     deferred: deferred
     }, 
     options));
   return deferred;
 },

И код, который вызывает функцию getItem это

  this.item.getPatientInfo().done(_.bind(function() {
    this.renderPatient(this.item);
  },this))
  .fail(function(error){
    // This won't show unlike native $.ajax .fail where it will show the error
    // Not sure why it's not working
    console.log(error);
  });

Однако, когда я пытаюсь смоделировать сбой, такой как отключение моей сети,.fail не будет перехватывать сбойный запрос GET. Я не буду выполнять console.log(ошибка);

Но если я изменю его с помощью нативного jquery, например, с использованием $.ajax(). Success(). Error(function(error){console.log(error)}), ошибка будет работать, и я смогу увидеть ошибка в моей вкладке консоли.

Что случилось?

ОБНОВЛЕНИЕ, чтобы предотвратить проблемы, но не идеальный, я думаю. Исправлять это, потому что это отсутствует, не очень хорошая идея

  this.item.getPatientInfo().done(_.bind(function() {
    if (this.item.attributes.info !== undefined) {
      this.renderPatient(this.item);
    }
  },this))

1 ответ

Решение

Backbone Model уже возвращает отложенную версию, я не вижу веской причины для этой слишком сложной реализации - лучше работать с Backbone, чем с ним. например

var SomeModel = Backbone.Model.extend({
    url: 'http://jsonplaceholder.typicode.com/posts/1'
});

var someModel = new SomeModel();
someModel.fetch()
.done(function(response) {
    console.log('Post title: ', response.title);
    console.log('Post body: ', response.body);
})
.fail(function(jqXHR, textStatus, errorThrown) {
    console.log('failed');
});

Скрипка: http://jsfiddle.net/ferahl/5zzzchpq/

Обратите внимание, что вы также можете получить доступ к новым атрибутам в done т.е. someModel.get('title')или вместо этих отложенных обратных вызовов вы можете использовать 'sync' а также 'error' события модель запускает для успеха и неудачи.

Другие вопросы по тегам