2

サンプルアプリからバックボーンを理解しようとしています(https://github.com/elfsternberg/The-Backbone-Storeを参照)。以下のコードに示すように、コードはjQueryのDeferredとpromise()を使用します。jQueryのドキュメントを読みましたが、以下の例からこれらのメソッドがどのように使用されているかを理解するのに問題があります。この質問に答えるにはもっとコードが必要かもしれませんが、そうではないかもしれません。これらは私がそれについて持っている質問です

1)fadeOutが実行されると、dfd.resolveが呼び出されますか?もしそうなら、dfd.resolveは何をトリガーしますか?

2)promise.promise();を返すことによって何が起こっているか。Deferredメソッドを呼び出していますか?いつ?なぜこのように行われるのですか?これは再帰的な方法のように見えますか?

3)dfd.resolveがこのコードに示されていない他のメソッドをトリガーしている可能性はありますか?

      hide: function() {
            if ((":visible") === false) {

                return null;

            }
            promise = $.Deferred(_.bind(function(dfd) { 
                this.el.fadeOut('fast', dfd.resolve)}, this));
            return promise.promise();
        },

        show: function() {
            if (this.el.is(':visible')) { 
                return;
            }       
            promise = $.Deferred(_.bind(function(dfd) { 
                console.log("in promise section of show in base view");
                this.el.fadeIn('fast', dfd.resolve) }, this))
            return promise.promise();
        }
4

1 に答える 1

4

1)fadeOutが実行されると、dfd.resolveが呼び出されますか?もしそうなら、dfd.resolveは何をトリガーしますか?

はい。 jQuery.fadeOutパラメータの1つとしてコールバックを受け取ります。アニメーションが完了すると、コールバックが実行されます。この場合、それはたまたまDeferredのresolveメソッドです。

2)promise.promise();を返すことによって何が起こっているか。Deferredメソッドを呼び出していますか?いつ?なぜこのように行われるのですか?これは再帰的な方法のように見えますか?

ここでは再帰的なことは何も起こっていませんpromise作成されたDeferredオブジェクトへの参照を保持する単なる変数です。は、動作を変更できないDeferredの変更バージョンを返すpromise()上のメソッドです。jQuery.Deferredしたがって、呼び出し元が常に同じ方法で実行されることを確認できるという約束。

3)dfd.resolveがこのコードに示されていない他のメソッドをトリガーしている可能性はありますか?

はい。Deferredは、コールバックを登録できるオブジェクトにすぎません。.resolve()Deferredを呼び出すと、doneハンドラーがトリガーされ呼び出しを行うと、失敗したハンドラー.reject()がトリガーされます。

非常に簡単な例は次のようになります。

//A Deferred takes in a function that will be passed a reference
// to the Deferred object. This allows you to resolve or reject
// it at some point in the future.
var promise = $.Deferred(function(def){

   setTimeout(function(){

      def.resolve('Five seconds have passed!');      

   }, 5000);

}).promise();

//This will only get executed when the
// underlying Deferred gets resolved
promise.done(function(msg){

   alert(msg); // Displays: 'Five seconds have passed!'

});
于 2012-09-30T04:51:16.917 に答える