4

次のコードがあるとします。

function someProcess() {
    var deferred = $.Deferred();

    apiCall(function (recvData) {
        deferred.resolveWith(null, [recvData]);
    });

    return deferred.promise();
}

function mainFunction() {
    $.when(someProcess())
        .then(someOtherProcess);
}

この例では、単一の deferred が解決されるのを待つだけで済みます。この場合、2 番目の関数を上記のように書くことと、次のように書くことの違い (もしあれば) は何ですか?

function mainFunction() {
    someProcess()
        .then(someOtherProcess);
}

つまり、jQuery の遅延オブジェクトを使用していることが明確になるので、最初の方法で書くのが好きですが、この場合に必要かどうか知りたいです。

編集: then() 呼び出しのタイプミスを修正しました。それをキャッチしてくれてありがとう。

編集:nbinowitzさん、回答ありがとうございます。when() を使用することと、生の jQuery 遅延オブジェクト インスタンスを使用することに関して、私が確信を持っていなかったポイントを釘付けにしたと思います。遅延オブジェクト全体ではなく promise を返すようにコードを再度修正しました。それが私が実際のコードで行う方法ですが、ここに追加するのを忘れていました。

4

1 に答える 1

2

カスタムのDeferredオブジェクトは使用していませんが、例には2つの違いがあることを理解しています。

  • を使用$.when()すると、ハンドラーによって処理される遅延オブジェクトを任意に追加できます。明らかに、大したことではありません。遅延を追加するには、いずれかの方法でそのコード行を変更する必要があるからです。

  • $.when()延期されたオブジェクト全体ではなく、Promiseオブジェクトのみを取得します。これは、私が正しく理解していれば、延期された状態変更メソッド(たとえばresolve())を非表示にする一貫性の尺度であり、ハンドラーフックと状態検査メソッドのみを公開します。これは良い習慣のように思えますが、あなたの例では、のsomeProcess().promise()代わりに呼び出すことで同じことを行うことができます$.when(someProcess())

ですから、あなたは正しいと思います。どちらの方法でも機能しますが、使用する主な利点は$.when()、コードを読みやすくし、他のプログラマーに適切に期待を設定できることです。またはのいずれ$.when()かを使用deferred.promise()すると、混乱を招く方法で延期された状態を混乱させる能力の低いコーダーから保護するのにさらに役立ちます。

于 2011-10-31T18:57:13.820 に答える