28

単純なDeferredオブジェクトを作成しましょう。

defer = $.Deferred( function ( defer ) {
    setTimeout( defer.resolve, 3000 );
});

上記のDeferredオブジェクトは3秒間「保留中」の状態になり、その後「解決済み」の状態に切り替わります(この時点で、それにバインドされているすべてのコールバックが呼び出されます)。

また、そのDeferredオブジェクトのpromiseを取得してみましょう。

promise = defer.promise();

ここで、Deferredオブジェクトが解決されたときに呼び出されるコールバックを追加するには、.done()またはを使用できます.then()。ただし、このメソッドは、Deferredオブジェクト自体または独自のpromiseオブジェクトの両方で呼び出すことができます。

defer.then( handler );

また

promise.then( handler );

どちらの場合も、handler関数が呼び出されます(この場合は3秒後)。

を使用する$.whenと、Deferredオブジェクト自体またはそのpromiseオブジェクトを再度渡すことができます。

$.when( defer ).then( handler );

また

$.when( promise ).then( handler );

繰り返しますが、上記の2行のコードに違いはありません。

ライブデモ: http: //jsfiddle.net/G6Ad6/

だから、私の質問は、Deferredオブジェクト自体.then().done()、などを呼び出すことができ、そのDeferredオブジェクトをに渡すことができるので、promiseオブジェクトを取得する$.when()ポイントは何ですか?.promise()promiseオブジェクトの目的は何ですか?機能にこの冗長性があるのはなぜですか?

4

3 に答える 3

25

.resolve()およびメソッドを使用せずに、遅延値の「封印された」コピーを作成し.reject()ます。ドキュメントから:

このdeferred.promise()メソッドにより、非同期関数は、他のコードがその内部要求の進行状況またはステータスに干渉するのを防ぐことができます。

値を変更しても意味がない場合に使用されます。たとえば、jQueryがAJAXリクエストを行うと、promiseオブジェクトが返されます。内部的には、ユーザーが約束を守って観察する.resolve()元のオブジェクトの値です。Deferred

于 2011-11-10T00:16:54.483 に答える
2

Deferredオブジェクトの「promise」を使用する場合、オブザーバー(例の解決を待機しているオブジェクト)はDeferredオブジェクト自体に直接アクセスできないため、例として、そのDeferredのメソッド「Resolve」を呼び出すことはできません。これは、元のDeferredを保護する方法です。

于 2013-12-18T09:33:48.553 に答える
0

Deferredを使用すると、その状態を制御できますset

Promiseに関しては、状態を読み取り、コールバックを添付することができます。get

于 2015-11-12T09:18:52.510 に答える