Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有一种简单的方法可以让集合上的jQuery动画创建一个新的承诺?_Javascript_Jquery_Animation_Promise - Fatal编程技术网

Javascript 有没有一种简单的方法可以让集合上的jQuery动画创建一个新的承诺?

Javascript 有没有一种简单的方法可以让集合上的jQuery动画创建一个新的承诺?,javascript,jquery,animation,promise,Javascript,Jquery,Animation,Promise,在没有任何参数的jQuery集合上调用promise方法时,我得到一个promise,一旦集合中元素上的所有动画完成,它就会解析。在该元素上对同一方法的每一次进一步调用都将返回相同的承诺。是否有一种简单的方法“重置”承诺,以便在初始动画完成且初始承诺解决后,我可以处理下一个动画何时完成 $('.some-element').slideDown(); $('.some-element').promise().done(function () { // e.g. evaluate the "di

在没有任何参数的jQuery集合上调用
promise
方法时,我得到一个promise,一旦集合中元素上的所有动画完成,它就会解析。在该元素上对同一方法的每一次进一步调用都将返回相同的承诺。是否有一种简单的方法“重置”承诺,以便在初始动画完成且初始承诺解决后,我可以处理下一个动画何时完成

$('.some-element').slideDown();
$('.some-element').promise().done(function () {
  // e.g. evaluate the "display" property of the element which should not be "none"
  this.slideUp();
  this.promise().done(function () {
    // e.g. evaluate the "display" property of the element which should be "none"
  });
});

上面代码中的问题是对
promise
的第二次调用返回与第一次调用相同的承诺。由于该承诺已被解决,第二个处理程序中的求值显示“display”属性不是“none”,因为
slideUp
动画尚未完成。

您可以将承诺数组传递给
$。当
时,如

中所述,您可以将承诺数组传递给
$。当
时,如

中所述,请尝试

$(function () {
    function slider(d, next, callback) {
        $("div").slideUp({
            duration: d,
            done: function (promise) {
                if (promise.state() === "resolved" 
                   && $(this).css("display") === "none") {
                    console.log($(this).css("display"));
                    $(this).slideDown({
                        duration: d,
                        done: function (promise) {
                            if (promise.state() === "resolved" 
                               && $(this).css("display") === "block") {
                                console.log($(this).css("display"));
                                slider(next, (d + next) / 2, function () {
                                    console.log("next animation beginning at " 
                                               + $.now());
                                });
                            }
                        },
                        complete: function () {
                            return callback != undefined ? callback() : $.noop();
                        }
                    });
                };
            }
        });
    };
    slider(3000, 1500, function () {
        console.log("next animation beginning at " + $.now())
    });
});
JSFIDLE

请参见,
开始时的
选项
进度
完成
始终
承诺
);另请参见
步骤
完成
回调

尝试

$(function () {
    function slider(d, next, callback) {
        $("div").slideUp({
            duration: d,
            done: function (promise) {
                if (promise.state() === "resolved" 
                   && $(this).css("display") === "none") {
                    console.log($(this).css("display"));
                    $(this).slideDown({
                        duration: d,
                        done: function (promise) {
                            if (promise.state() === "resolved" 
                               && $(this).css("display") === "block") {
                                console.log($(this).css("display"));
                                slider(next, (d + next) / 2, function () {
                                    console.log("next animation beginning at " 
                                               + $.now());
                                });
                            }
                        },
                        complete: function () {
                            return callback != undefined ? callback() : $.noop();
                        }
                    });
                };
            }
        });
    };
    slider(3000, 1500, function () {
        console.log("next animation beginning at " + $.now())
    });
});
JSFIDLE


请参见,
开始时的
选项
进度
完成
始终
承诺
);另请参见
步骤
完成
回调

是否确定
引用jQuery对象?在我看来,
this.slideUp()
this.promise()
根本不起作用。如果在新的jQuery对象上调用
.promise
,它肯定会返回一个新的promise。为什么不直接调用
。然后(function(){/*which*/})
在原始promise对象上?@FelixKling根据
promise
方法文档页面上的一个示例,其值相当于调用
promise
方法的集合。在这种情况下,我对它的价值没有任何问题。它对我来说非常好->@Pointy,它与我的示例代码具有相同的效果,即承诺只能解决一次。当我调用
slideUp
方法时,我想在完成jQuery启动的动画后做一些事情。理想情况下,我会有一个可以侦听的事件,而不必依赖承诺,因为承诺是用于单个异步任务的。您确定
这个
指的是jQuery对象吗?在我看来,
this.slideUp()
this.promise()
根本不起作用。如果在新的jQuery对象上调用
.promise
,它肯定会返回一个新的promise。为什么不直接调用
。然后(function(){/*which*/})
在原始promise对象上?@FelixKling根据
promise
方法文档页面上的一个示例,其值相当于调用
promise
方法的集合。在这种情况下,我对它的价值没有任何问题。它对我来说非常好->@Pointy,它与我的示例代码具有相同的效果,即承诺只能解决一次。当我调用
slideUp
方法时,我想在完成jQuery启动的动画后做一些事情。理想的,我可以听一个事件,而不必依赖承诺,因为承诺是针对单个异步任务的。请将其扩展为一个答案。@ArtoAle我相信
$。当
方法类似于本机的
承诺时。all
方法的目标是在完成多个承诺后做一些事情已解决(在知道一系列异步任务都已完成之前,您不想做出反应)。我要做的是处理动画在特定元素上完成的时间,然后在下一次动画在相同的元素上完成时以不同的方式处理。这里最好有一个事件监听器来观察动画完成情况……请将其扩展为一个答案。@ArtoAle我相信
$。当
方法类似于本机的
承诺时。all
方法的目标是在多个承诺都得到解决后做一些事情(在知道一系列异步任务都已完成之前,您不想做出反应)。我尝试的是处理动画在特定元素上完成的时间,然后在下一次动画在同一确切元素上完成时以不同的方式处理。这里最好使用事件侦听器来观察动画完成情况。。。