あなたが正しい。dfd.resolve
へのコールバックとして渡されるfadeOut
ため、フェードアウトが完了すると promise が解決されます。
promise = $.Deferred
プロミスではなくオブジェクトを$.Deferred
返すため、誤解を招く可能性があります。Deferred
deferred を呼び出す.promise()
と、promise が返されます。
deferred と promise の違いは、promise は ( 、 、 、 、または を介して) コールバックを登録するためにのみ使用されるのに対し、元のalways
deferredオブジェクトにはメソッドもあるということです。done
fail
pipe
progress
then
resolve
要約すると、 aは元の からメソッド (および関連するメソッド) を除いたものpromise
と同じです。これはあなたの を保護するために使用されるため、あなただけがそれを解決/拒否できるようになります。呼び出し元ができることは、それにコールバック関数を追加することだけです。deferred
resolve
promise
ドキュメントからの引用は次のとおりです。
このdeferred.promise()
メソッドにより、非同期関数は、他のコードがその内部要求の進行状況またはステータスに干渉するのを防ぐことができます。Promise は、追加のハンドラーをアタッチするか、状態を判断するために必要な Deferred メソッド ( then
、done
、fail
、always
、、および) のみを公開しますが、状態を変更するメソッド( 、、pipe
、、および) は公開しません。progress
state
resolve
reject
notify
resolveWith
rejectWith
notifyWith
これを簡単にするために、アンダースコアのバインドを削除しましょう。
function hide () {
var deferred = $.Deferred(function(dfd) {
$('div').fadeOut('slow', dfd.resolve)
});
return deferred.promise();
}
hide().then(function () {
alert('Fade out is done!');
});
これがフィドルです:http://jsfiddle.net/fDUej/