1

私はこのコードで立ち往生しています:

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;
        }

「リロード」では、「アンロード」シーケンスが完了した後に「ロード」シーケンスを開始する必要がありますが、「アンロード」シーケンス要素の最初の反復が非表示になった直後に開始されます。助けてください、私は立ち往生しています(

4

1 に答える 1

1

テストされていませんが、これを試してください:

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 などの Deferred オブジェクトを返さないため、手動で Deferred/promise を返す必要があります。パイプされた関数のチェーンが完了すると、メインの Deferred が解決されます。メインの Deferred の promise を返すことを忘れないでください。

私が言ったように、保証はありませんが、試してみてください!

于 2011-10-12T12:57:04.763 に答える