Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.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_Jquery Deferred_Promise - Fatal编程技术网

Javascript 取消jQuery中的延迟承诺

Javascript 取消jQuery中的延迟承诺,javascript,jquery,jquery-deferred,promise,Javascript,Jquery,Jquery Deferred,Promise,如何在不从DOM中删除元素的情况下取消承诺 我运行了以下代码: $("#box") .delay(2000) .show("slow") .delay(2000) .promise() .then(function(){log("Done");}); 在此之后,有没有办法取消承诺?clearQueue()和stop(true)都不起作用,因为这不是我要取消的动画。我看到remove()应该可以做到这一点。。。但是我只

如何在不从DOM中删除元素的情况下取消承诺

我运行了以下代码:

$("#box")
  .delay(2000)
  .show("slow")
  .delay(2000)
  .promise()                            
  .then(function(){log("Done");});

在此之后,有没有办法取消承诺?
clearQueue()
stop(true)
都不起作用,因为这不是我要取消的动画。我看到
remove()
应该可以做到这一点。。。但是我只想停止承诺,而不是删除整个元素。

我相信您可以使用
$(“#box”).remove()

从以下jQuery文档:

返回的承诺链接到元素的.data()上存储的延迟对象。由于.remove()方法将删除元素的数据以及元素本身,因此它将阻止解析元素的任何未解析承诺。如果有必要在解析某个元素的承诺之前将其从DOM中移除,请改用.detach(),并在解析后使用.removeData()


我想你不会想要这样的东西吧?我涉及到两个承诺(一个只是在动画集结束时处理问题,另一个是根据需要解决或拒绝问题)。

在这种情况下,你想使用延迟而不是承诺,但是,你可以使用动画的承诺来解决延迟问题

var stopDone=true;
函数日志(msg){
$(“.debug”).append(新日期()+”-“+msg+”
); } 日志(“启动”); var boxAnimation=new$.Deferred(); boxAnimation.done(函数(){ 日志(“完成”); }); 失败(函数(){ 日志(“停止”); }); $(“#box”).delay(2000).show(“slow”).delay(2000).promise().then(function()){ boxAnimation.resolve();//完成所有动画后,解析延迟的动画。 }); 如果(停止) { 拒绝(); }

顺便说一句,延期只能被拒绝或解决一次。一旦被拒绝或解决,你就不能改变他们的状态。

好消息。从昨天起,你可以取消你的承诺

我发布了我的小插件的新版本,它提供了许多方法中的两个,分别是.wait()和.unwait()

如果随后要注销回调,请执行以下操作:

$.unwait();
wait和unwait的这些静态版本还支持一个可选的组名,以不取消任何处理程序,而只取消特定的组

除此之外,你还可以做很多更聪明的事情,比如:

$('#box').wait(deferred).addClass('ready');
或者将整个代码放在一个链中,不带unwait选项:

$("#box").delay(2000).show("slow")
  .delay(2000).join(function(){log("Done");})).addClass('ready');
或者使用取消两次暂停的选项来缩短时间:

$("#box").wait(2000).show("slow",$)
  .wait(2000, function(){log("Done");})).addClass('ready');

只要看看最适合您的文档、示例和API即可。

我看到了'remove(),但我想知道是否有一种方法可以在不删除实际元素的情况下执行此操作。编辑的问题。是的,必须从dom中删除元素似乎并不理想。这是我使其工作的唯一方法。祝您在寻找更好的解决方案时好运。当然,我最好奇的是anima会发生什么情况一旦你拒绝了承诺,你会怎么做?有点笨拙的语法…我希望有一种方法可以真正取消承诺…在当前的实现中可能没有方法。如果你只有承诺对象(并且没有访问原始对象的权限),那么这应该是不可能做到的。承诺的思想是能够在没有解决/拒绝功能的情况下侦听正在解决或拒绝的延迟。您可以做的是创建一个承诺包装,公开原始的承诺函数,但所有回调都绑定了一个包装函数,该函数侦听某种标志为了避免在延迟被标记为已取消时触发回调,您实际上只需要创建一个延迟并手动拒绝或以您认为合适的方式解决它。只是一个查询:我不能使用deferred.reject()吗?
$("#box").delay(2000).show("slow")
  .delay(2000).join(function(){log("Done");})).addClass('ready');
$("#box").wait(2000).show("slow",$)
  .wait(2000, function(){log("Done");})).addClass('ready');