Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   backboneJS, дождаться выполнения всех AJAX запросов. (https://javascript.ru/forum/library-toolkit-framework/22540-backbonejs-dozhdatsya-vypolneniya-vsekh-ajax-zaprosov.html)

anty 24.10.2011 12:24

backboneJS, дождаться выполнения всех AJAX запросов.
 
В общем в представлении используется 2е разные коллекции. В инициализации представления пишу так:
initialize : function() {
	var self = this;
	this.model1.fetch({success: function(){ 
               			self.model2.fetch({success: function(){ 
											self.render();
										});
 				}});
}

И вот такая вложенность мне не очень нравиться, можно как нибудь от нее избавиться? Т.е. как лучше это сделать?
В идеале хотелось бы получить как у gmail. :help:

aleksp 28.12.2011 04:30

Странно, что никто так и не ответил тут. Задача на самом деле очень распространенная. Если топикстартеру ещё актульно, то подскажу. Тебе нужно изучить тему deferred-объектов в jQuery. Любой AJAX-запрос в последних версиях является таким объектом. Такие же объекты можно создавать и для своих нужд. Не буду вдаваться в подробности - в сети куча уже информации на эту тему. Конкретно в твоём случае решение таково:

Раз Model::fetch возвращает deferred-объект, значит делаем так
initialize: function() {

    var self = this;

    $.when(this.model1.fetch(), this.model2.fetch())
        .done(function() {
            // Здесь код в случае успешного выполнения всех запросов
            self.render();
        })
        .fail(function() {
           // Здесь код, если произошел сбой
        });
}


Здесь метод $.when() ждет когда будут выполнены все deferred объекты. Их может быть сколько угодно:
$.when(this.model1.fetch(), this.model2.fetch(), ...., this.modelN.fetch())


Часовой пояс GMT +3, время: 14:38.