2012-03-07 15 views
11

DOMから要素を削除せずにプロミスをキャンセルするにはどうすればよいですか? jQueryで遅延プロミスをキャンセルする

fiddle

が、私はこのコードを実行しました。この後

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

を、約束をキャンセルする方法はありますか? clearQueue()stop(true)は、私が取り消そうとしているアニメーションではないため動作しませんでした。私はそれがremove()それを行う必要があることを見た...しかし、私は約束を停止し、全体の要素を削除しないようにしたい。

+1

プロミスオブジェクトしか持たず(元のオブジェクトへのアクセス権がない)、それを行うことは不可能です。約束のアイデアは、解決/拒否機能なしに、解決済みまたは拒絶済みの聴取を行うことができるようにすることです。あなたができることは、元の約束の関数を公開する約束ラッパーを作成することですが、すべてのコールバックは、延期が取り消されているとフラグが立てられた場合にコールバックを引き起こさないような何らかのフラグを待ち受けるラッピング関数にバインドされます。 –

+0

ほとんどの場合、遅延したものを作成して手動で拒否したり、適切に見えるように解決したいだけです。 –

答えて

4

昨日からあなたは約束を取り消すことができます。

私は、小さなプラグインjquery-timingの新しいバージョンを公開しました。このプラグインは、多くの場合、.wait()と.unwait()という2つのメソッドを提供します。

var deferred = $("#box").delay(2000).show("slow").delay(2000).promise(); 
$.wait(deferred, function(){ log("Done"); }); 

あなたは、コールバックの登録を解除したい場合:

$.unwait(); 

待ちのこれらの静的バージョンとunwaitはまた、任意のハンドラだけ特定のセットを解除しないように、オプションのグループ名をサポートしています。

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

かのオプションを使用してさらに短い同じ:unwaitオプションを使用せずに、

$('#box').wait(deferred).addClass('ready'); 

または1つの鎖中の全コード:あなたのような多くのスマートなものを行うことができるほか

2つの一時停止を解除してください:

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

あなたに最適なものをドキュメント、サンプル、APIでご覧ください。

+0

ちょうどクエリ:私はdeferred.reject()を使用できませんか? –

2

私はあなたがここにjQueryのドキュメントから$('#box').remove();

を使用することができると信じて:http://api.jquery.com/promise/

ザ・プロミスは、要素の.dataの()に保存されている繰延オブジェクトにリンクされて戻りました。 .remove()メソッドは要素のデータと要素自体を削除するため、要素の未解決の約束が解決されないようにします。その約束が解決される前に、DOMから要素を削除する必要がある場合は、代わりに)(.detach使用し、解像度後.removeData()に従ってください。」

+0

さて、私は 'remove() 'を見ましたが、実際の要素を削除せずにそれを行う方法があるのだろうかと思っていました。編集された質問。 – ripper234

+1

そうです、domから要素を削除することは理想的ではありません。私はそれを働かせる唯一の方法でした。より良い解決策を探すためには最高の運があります。 – Paul

1

を私はあなたが何かをしたいと思います仮定しません。 http://jsfiddle.net/2cq8M/のように私は2つの約束事を必要としています(アニメーションの終わりのケースを扱うものと、必要に応じて解決するものと拒否するものとがあります)。

+0

もちろん、私が興味を持っている最大のことは、約束を拒否すれば、アニメーションに起こるはずのことです。 – JayC

+0

少し複雑な構文...私は実際に約束を取り消す方法を望んでいました...現在の実装では方法がないかもしれません。 – ripper234

1

このケースでは、アニメーションの約束を使用して延期を解決することができます。

http://jsfiddle.net/LG9eZ/9/

var stopDone = true; 

function log(msg) { 
    $(".debug").append(new Date() + " - " + msg + "<br/>"); 
} 

log("Starting"); 

var boxAnimation = new $.Deferred(); 
boxAnimation.done(function() { 
    log("Done"); 
}); 
boxAnimation.fail(function() { 
    log("Stopped"); 
}); 


$("#box").delay(2000).show("slow").delay(2000).promise().then(function() { 
    boxAnimation.resolve(); // when all the animations are done, resolve the deferred. 
}); 


if (stopDone) 
{ 
    boxAnimation.reject(); 
} 

補足として、遅延は一度だけ拒否または解決できます。それらが拒否されたり解決されたりすると、その状態を変更することはできません。