【问题标题】:jQuery promise in function with each()jQuery 在函数中的 promise with each()
【发布时间】:2014-03-19 01:47:08
【问题描述】:

我正在尝试调用自己的函数并等待它完成。过渡结束后,我想开始下一个功能。 请看一下我的 jsfiddle http://jsfiddle.net/hrm6w/

console.log("upper finished") 应该在console.log("promise finished") 之后开始,所有动画都结束了。

在每个对象中的所有动画都结束后,我想开始下一个动作(函数)。

我认为promise() 函数是我所需要的,但我只是没有得到它的工作。

任何帮助将不胜感激。

【问题讨论】:

  • 在哪里进行 ajax 调用? jw,使用$.fn.ajaxTransitionOut有什么好处?
  • AJAX 调用在此函数之外,我尝试将 $.fn.ajaxTransitionOut 实现为通用函数,以根据给定的数据转换和数据转换为元素设置动画。我想重写gist.github.com/854622 来为选定的元素设置动画,而不仅仅是fadIn 和fadeOut
  • @felixaburg 如果答案对您有帮助,我将不胜感激您单击复选标记(赞成票旁边)以接受未来可能有类似问题的人的答案。您还应该回到其他三个问题,并接受那些对您有帮助的答案。

标签: jquery function each deferred promise


【解决方案1】:

玩了一会儿之后,您似乎需要从过渡中返回承诺。我稍微修改了一下,结果还是一样的。

这篇文章帮助解释了一些概念:http://hermanradtke.com/2011/05/12/managing-multiple-jquery-promises.html

演示:http://jsfiddle.net/lucuma/hrm6w/5/

    (function($) {
    //Transition Out
    $.fn.ajaxTransitionOut = function() {

        var $animators = $('.animate', this);
        $animators.each(function() {
            $(this).animate({
            left: 1000,
            opacity: 0
        }, 400);
        console.log('animating');
                        });
        return $animators.promise().done(function() {
            console.log('promise finished');
        });

    };

})(jQuery);

$(document).ready(function() {
    console.log('starting');
    $.when($('#content').ajaxTransitionOut()).done(function() {
        console.log('upper finished');
    });
    console.log('ending');

});​

【讨论】:

  • @lucuma - 链接已损坏
  • @Hogan,我在答案中包含了代码和一个工作 jsfiddle 的链接,这是一件好事。无论如何,我已经修复了外部博客的链接。
【解决方案2】:

我觉得就这么简单:

(function($) {
    $.fn.ajaxTransitionOut = function() {
        return this.find('.animate').each(function() {
            $(this).animate({
                left: 500,
                opacity: 0
            }, 4000);
        });
    };
})(jQuery);
$.when($('#content').ajaxTransitionOut()).done(function() {
    $('html').css('backgroundColor','#999');
});

小提琴 - http://jsfiddle.net/hrm6w/8/

您会看到我更改了常量和终端操作以更好地观察过程。

我承认我不完全理解为什么会这样,但似乎所有选定元素的复合承诺都隐含在插件返回的 jQuery 对象中(因此在方法链中可供.done() 使用)。

我希望这只会起作用,因为我们正在处理动画并且 Promise 的默认 type 是 'fx'(请参阅 documentation for .promise())。

编辑:

您也可以删除.when() 并在方法链中使用.promise() 生成一个明确的承诺,如下所示:

$('#content').ajaxTransitionOut().promise().done(function() {
    $('html').css('backgroundColor','#999');
});

插件保持不变。

【讨论】:

  • 以前也对我有用,但问题是每个循环。谢谢。
  • 插件中.each() 的存在是学术性的。没有它,nett 效果是相同的,因为 jQuery 实现了一个内部 each() 来循环选择元素。重要的是,您可以通过返回 jQuery 对象来保持插件的美观和简单,另外还有一个好处是插件可以链接用于其他目的 - 请参阅here。为了更简单和相同的净效应,请完全避免使用插件 - 请参阅here
猜你喜欢
  • 1970-01-01
  • 2010-10-12
  • 2016-01-31
  • 1970-01-01
  • 2012-09-10
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多