В fetch()
вызовы вы обстреливают асинхронных запросов AJAX, то есть код в ваших done
обработчиков не будет выполняться до тех пор пока возвращаются вызовы сервера. После того, как вы выполнили user.fetch()
, браузер закроет запрос, а затем продолжит работу с вашей программой и оповещает this.currentView
, не дожидаясь завершения запросов.
Последовательность событий в основном будет
- вызов
user.fetch()
- оповещения
this.currentView
- вызов
watchListsCollection.fetch()
- вызов
loggedUser.fetch()
- установить значение
self.currentView
Вы не сможете увидеть значение своего текущего окна до того, как завершится последний запрос сервера.
Если вы измените код
var self=this;
var watchListsCollection = new WatchlistCollection;
watchListsCollection.url = "watchlists";
user.fetch().done(function() {
watchListsCollection.fetch().done(function() {
loggedUser.fetch().done(function() {
self.currentView = new UserView(user, watchListsCollection,loggedUser);
alertCurrentView();
});
});
});
function alertCurrentView() {
alert(this.currentView);
}
Вы должны увидеть правильное значение, отображаемое. Теперь, в зависимости от того, что вы намереваетесь использовать this.currentView
, это может или не позволит вам исправить любую проблему, но у вас не будет возможности дождаться завершения всех запросов до ее доступности. Если вам нужно немедленно с ним что-то сделать, немедленно создайте свой UserView
и переместите fetch()
звонки в этот вид initialize()
.
Если вы собираетесь использовать обещание или генераторы вы могли бы также используйте 'Function.prototype.bind' вместо' _.bind'. Он работает, начиная с IE9 :) – ivarni