1つ目:存在しないので使え$.Promise();
ません。
deferred オブジェクトは、promise を作成し、その状態をresolved
orに変更できるオブジェクトですrejected
。Deferred は通常、独自の関数を作成し、呼び出し元のコードに promise を提供する場合に使用されます。あなたは価値の生産者です。
約束とは、その名の通り、将来の価値についての約束です。コールバックをアタッチして、その値を取得できます。約束はあなたに「与えられた」ものであり、あなたは将来の価値の受け手です。
promise の状態を変更することはできません。promise を作成したコードのみがその状態を変更できます。
例:
1. ( Produce ) 独自の関数に promise サポートを提供する場合は、遅延オブジェクトを使用します。値を計算し、promise がいつ解決されるかを制御したいとします。
function callMe() {
var d = new $.Deferred();
setTimeout(function() {
d.resolve('some_value_compute_asynchronously');
}, 1000);
return d.promise();
}
callMe().done(function(value) {
alert(value);
});
2. ( forward ) それ自体が promise を返す関数を呼び出している場合、独自の遅延オブジェクトを作成する必要はありません。その約束を返すだけです。この場合、関数は値を作成しませんが、転送します (一種の):
function fetchData() {
// do some configuration here and pass to `$.ajax`
return $.ajax({...});
}
fetchData().done(function(response) {
// ...
});
3. ( receive ) Promise/Value を作成したり渡したりしたくない場合、それらを直接使用したい場合があります。つまり、あなたはいくつかの情報の受信者です。
$('#my_element').fadeOut().promise().done(function() {
// called when animation is finished
});
もちろん、これらすべてのユースケースを混在させることもできます。関数は値の受信者 (たとえば、Ajax 呼び出しから) になり、それに基づいて別の値を計算 (生成) することができます。
関連する質問: