2

ドキュメントと他の誰かが書いたコードを使用してjQueryの遅延APIを理解しようとしていますが、非常に混乱しています。以下の関数を見て、説明していただけないでしょうか

  1. dfd.resolve の重要性は何ですか。それは、fadeOut が完了したことを意味しますか。つまり、fadeOut が完了した後にのみ実行されますか? これは遅延オブジェクトをjQueryのfadeOut関数に渡していますか?

  2. promise.promise(); の場合はどうなりますか? 返されますか?promise(); を呼び出す理由 約束のプロパティで?

    このコードを少し説明してもらえますか

    hide: function() {
            if (this.el.is(":visible") === false) {
                return null;
            }
            promise = $.Deferred(_.bind(function(dfd) {
                this.el.fadeOut('fast', dfd.resolve)}, this));
            return promise.promise();
        },
    
4

1 に答える 1

5

あなたが正しい。dfd.resolveへのコールバックとして渡されるfadeOutため、フェードアウトが完了すると promise が解決されます。

promise = $.Deferredプロミスではなくオブジェクトを$.Deferred返すため、誤解を招く可能性があります。Deferreddeferred を呼び出す.promise()と、promise が返されます。

deferred と promise の違いは、promise は ( 、 、 、 、または を介し​​て) コールバックを登録するためにのみ使用されるのに対し、元のalwaysdeferredオブジェクトにはメソッドもあるということです。donefailpipeprogressthenresolve

要約すると、 aは元の からメソッド (および関連するメソッド) を除いたものpromiseと同じです。これはあなたの を保護するために使用されるため、あなただけがそれを解決/拒否できるようになります。呼び出し元ができることは、それにコールバック関数を追加することだけです。deferredresolvepromise

ドキュメントからの引用は次のとおりです。

このdeferred.promise()メソッドにより、非同期関数は、他のコードがその内部要求の進行状況またはステータスに干渉するのを防ぐことができます。Promise は、追加のハンドラーをアタッチするか、状態を判断するために必要な Deferred メソッド ( thendonefailalways、、および) のみを公開しますが、状態を変更するメソッド( 、、pipe、、および) は公開しません。progressstateresolverejectnotifyresolveWithrejectWithnotifyWith


これを簡単にするために、アンダースコアのバインドを削除しましょう。

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/

于 2013-01-14T23:28:19.927 に答える