Понимание последовательностей $ .Deferred () и $ .fn.pipe () - PullRequest
1 голос
/ 06 октября 2011

Я застрял в этом коде:

reload: function() {
            var self = this;
            $.when(self.unload()).then(function() {
                self.load();
            });
        },
load: function() {
            var self = this;
            $.ajax({
                url: self.options.url,
                success: function(data) {
                    $.Deferred(
                        function(dfr) {
                            $.each(data, function() {
                                var div = $('<div></div>')
                                    .addClass('nw-item')
                                    .html('newsitem.ejs', this)
                                    .hide()
                                    .appendTo(self.element);
                                dfr = dfr.pipe(function() {
                                    return div.slideDown(self.options.speed);
                                });
                            });
                        }).resolve();
                }
            })
        },
unload: function() {
            var items = this.element.children('.nw-item').reverse(),
                self = this,
                udfd = $.Deferred(
                    function(dfr) {
                        $.each(items, function() {
                            var div = $(this);
                            dfr = dfr.pipe(function() {
                                return div.slideUp(self.options.speed);
                            });
                        });
                    }).resolve();
            return udfd;
        }

в «reload» мне нужно запустить последовательность «load» после завершения последовательности «unload», но она запускается сразу после первой итерации элемента последовательности «unload» становится скрытым. Помогите мне пожалуйста, я застрял (

1 Ответ

1 голос
/ 12 октября 2011

Не проверено, но попробуйте это:

unload: function() {
    var items = this.element.children('.nw-item').reverse();
    var self = this;
    var udfd = $.Deferred();
    var chain;
    $.each(items, function() {
        chain = udfd.pipe(function() {
            return $.Deferred(function(deferred) {
                div.slideUp(self.options.speed, function() {
                    // callback function gets executed when slideUp is done
                    deferred.resolve();
                });                
            }).promise();
        });
    });
    chain.done(function() {
        udfd.resolve();
    });
    return udfd.promise();
}

Поскольку ваша функция jQuery.slideUp является асинхронной, НО не возвращает отложенный объект, такой как, например, jQuery.ajax, вы должны вручную вернуть отложенное / обещание.Когда ваша цепочка переданных функций завершена, она решает основную задержку.Не забудьте вернуть обещание для основного Отложенного.

Как я уже сказал, гарантии нет, но вы можете попробовать!

...