延期対約束


83

jQueryバージョン以外のDeferredとPromiseの違いは何ですか?

必要に応じて何を使用すればよいですか?だけ呼びたいですfooExecute()。たとえば、fooStart()とだけでfooEnd()htmldivステータスを切り替えることができます。

//I'm using jQuery v2.0.0
function fooStart() { /* Start Notification */ }
function fooEnd() { /* End Notification */ }
function fooExecute() { /* Execute the scripts */ }

$('#button1').on('click', function() {
    var deferred1 = $.Deferred();
    var promise1 = $.Promise();

    deferred1.???

    promise1.???
});


2
約束の状態を変更することはできません。したがって、それは要求ロジック(条件ロジックを改ざんするビジネスがない可能性があります-解決または拒否)-解決を待つ-実際にそれを延期したファクトリロジックから処理されます。繰延が可能なresolveDまたはrejectその約束も反映されます、その状態を変更するエド。クリックに据え置きをどのように使用したいか教えてください。
アンドレビンスキー2013年

私はあなたの例が約束から利益を得ることができるとは思わない(または私はそれを理解していない)。たぶん、jQuerydeferredをどのように使用できるかを見てください
Felix Kling 2013年

回答:


131

第一:$.Promise();存在しないため使用できません。

繰延オブジェクトができるオブジェクトである作成の約束をしてまでその状態を変更しますresolvedrejected。独自の関数を作成し、呼び出し元のコードにpromiseを提供する場合は、通常、遅延が使用されます。あなたは価値のプロデューサーです。

約束は名前が言うように、将来の値についての約束です。その値を取得するためにそれにコールバックを添付することができます。約束はあなたに「与えられ」、あなたは将来の価値の受け手です。
promiseの状態を変更することはできません。promiseを作成したコードのみが、その状態を変更できます。

例:

1.(プロデュース)独自の関数にpromise-supportを提供する場合は、据え置きオブジェクトを使用します。値を計算し、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.(転送)それ自体がpromiseを返す関数を呼び出す場合は、独自の遅延オブジェクトを作成する必要はありません。あなたはただその約束を返すことができます。この場合、関数は値を作成しませんが、それを転送します(種類):

function fetchData() {
    // do some configuration here and pass to `$.ajax`
    return $.ajax({...});
}

fetchData().done(function(response) {
    // ...
});

3.(受信)プロミス/値を作成したり渡したりしたくない場合、それらを直接使用したい場合があります。つまり、いくつかの情報の受信者です。

$('#my_element').fadeOut().promise().done(function() {
    // called when animation is finished
});

もちろん、これらすべてのユースケースを混在させることもできます。関数は(たとえばAjax呼び出しからの)値のレシーバーになり、それに基づいて異なる値を計算(生成)することができます。


関連する質問:


2

promiseは、遅延コレクションが完了したときに実行される遅延オブジェクトに設定できるものです。

jQueryドキュメントの例:

<!DOCTYPE html>
<html>
<head>
  <style>
div {
  height: 50px; width: 50px;
  float: left; margin-right: 10px;
  display: none; background-color: #090;
}
</style>
  <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
</head>
<body>

<button>Go</button>
<p>Ready...</p>
<div></div>
<div></div>
<div></div>
<div></div>


<script>
$("button").on( "click", function() {
  $("p").append( "Started...");

  $("div").each(function( i ) {
    $( this ).fadeIn().fadeOut( 1000 * (i+1) );
  });

  $( "div" ).promise().done(function() {
    $( "p" ).append( " Finished! " );
  });
});
</script>

</body>
</html>

ここはJSFiddleにあります

これにより、それぞれdivで関数が実行され、.promiseすべての.each実行が完了するとコードが実行されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.