Я постараюсь как можно больше упростить это.
Мои маршруты.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?
Спасибо!
Насколько я могу судить, вы не должны return this._conversations
но всегда this._conversations
доступ к this._conversations
через обратный вызов, независимо от того, произошла ли выборка или нет.
Вы можете сделать это, изменив обработчик успешной выборки, чтобы читать: -
success: function(c) {
c._fetched = true;
_callback();
},
и (если вы в ней не нуждаетесь), удалив строку: -
return this._conversations;
Это, по крайней мере, гарантирует, что при обратном вызове вы получите такое же поведение при первом и последующих вызовах.
В Backbone 1.1 fetch()
больше не запускает событие reset
по умолчанию. Либо reset: true
для вызова fetch()
или (рекомендуется), вместо этого прослушайте событие sync
.