Backbone.js - Fetch () не вызывается из моего роутера

0

Я постараюсь как можно больше упростить это.

Мои маршруты.js:

direct_message: function(member_id) {

  list.conversations(function(conversations) { 
    conversation_view.model = conversations.models[conversations.models.length - 1];
    conversation_view.render();
  });

Итак, conversations() - это функция внутри моей модели списка, которая имеет удобный метод fetch() и обратный вызов (который является тем методом, в который я перехожу). Он проверяет, были ли извлечены вещи, и если да, возвращает обратный вызов с выбранными параметрами.. Так же:

conversations: function(callback) {
  var _callback = _.bind(function() { if(callback) callback(this._conversations); }, this);
  if(!this._conversations) {
    this._conversations = new app.collections.Conversations();
    this._conversations.url = this._url();
    app.events.on('pusher:conversation_started', this._conversation_started, this);
  }
  if(this._conversations._fetched) {
    _callback();
  } else {
    this._conversations.on('reset', _callback);
    if(!this._conversations._fetching) {
      this._conversations._fetching = true;
      this._conversations.fetch({
        success: function(c) { c._fetched = true; },
        error: function(c) { c._fetching = false; }
      });
    }
  }
  return this._conversations;
},

Уф! Надеюсь, я еще не потерял тебя. Так что это каскадировало все хорошо и правильно на некоторое время. Но теперь, по какой-то причине, когда я выполняю этот метод в моих routes.js, он возвращается обратно как undefined.

Причина, по которой я думаю, что это происходит, заключается в том, что этот запрос выборки является асинхронным. Таким образом, возврат возвращается правильно, но оператор return вызывается до return данных. Таким образом, все остальные вызовы в conversation() фактически возвращаются правильно, за исключением первого, который его инициализировал.

Затем я подумал, позвольте мне добавить async: false к вызову fetch(), но когда я это сделаю, почему-то последующие вызовы возвращаются undefined. Есть ли что-нибудь еще, что я могу сделать? Может, что-то еще я должен смотреть? Возможно, каким-то образом включить в него объекты $.deferred?

Спасибо!

Теги:
asynchronous
jquery-deferred
fetch
backbone.js

2 ответа

1
Лучший ответ

Насколько я могу судить, вы не должны return this._conversations но всегда this._conversations доступ к this._conversations через обратный вызов, независимо от того, произошла ли выборка или нет.

Вы можете сделать это, изменив обработчик успешной выборки, чтобы читать: -

success: function(c) {
    c._fetched = true;
    _callback();
},

и (если вы в ней не нуждаетесь), удалив строку: -

return this._conversations;

Это, по крайней мере, гарантирует, что при обратном вызове вы получите такое же поведение при первом и последующих вызовах.

  • 0
    Вау, я не могу поверить, что я не думал об этом. Большое спасибо Beetroot-Beetroot! (Я на самом деле пью свеклу прямо сейчас)
  • 1
    «пить свеклу» - странно, что это то, чего я никогда не делал - слишком похоже на каннибализм, я полагаю.
1

В Backbone 1.1 fetch() больше не запускает событие reset по умолчанию. Либо reset: true для вызова fetch() или (рекомендуется), вместо этого прослушайте событие sync.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню