1. ホーム
  2. jquery

[解決済み] 繰延べと約束

2022-02-06 11:06:19

質問

DeferredとPromiseの違いは、jQueryのバージョン以外に何かあるのでしょうか?

私の必要性には何を使うべきでしょうか? 私は fooExecute() . 必要なのは fooStart()fooEnd() でhtmlのdivの状態を切り替えるなど。

//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.???
});

解決方法は?

第一に $.Promise(); は存在しないからです。

A 遅延オブジェクト は、以下のことが可能なオブジェクトです。 作成 プロミスを作成し、その状態を resolved または rejected . Deferredsは通常、自分で関数を書いて、呼び出し元のコードにプロミスを提供したい場合に使用します。あなたは プロデューサー を生成します。

A 約束 は、その名の通り、将来の値に関する約束です。その値を得るためにコールバックを付けることができる。この約束はあなたに"given"され、あなたが レシーバー 将来の値の
プロミスの状態を変更することはできません。というコードのみです。 作成された は、プロミスの状態を変更することができます。

1. ( プロデュース ) 遅延オブジェクトを使用するのは、独自の関数にプロミスサポートを提供したい場合です。値を計算し、プロミスが解決されるタイミングを制御したい場合です。

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. ( 前方 ) もし、それ自体がプロミスを返す関数を呼び出しているのであれば、独自のディファード・オブジェクトを作成する必要はないでしょう。そのプロミスを返せばいいのです。この場合、関数は値を生成するのではなく、(一種の)転送を行います。

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の呼び出しから)値を受け取り、それに基づいて別の値を計算する(生成する)ことができます。


関連する質問