24

promise を使用する JS コードをいくつか書いています。たとえば、フォーム ポップアップを開き、jQuery Deferredオブジェクトを返します。それはこのように動作します:

  • ユーザーがフォームで [OK] をクリックして検証すると、Deferred はフォーム データを表すオブジェクトに解決されます。

  • ユーザーが [キャンセル] をクリックすると、Deferred は null に解決されます。

私が決定しようとしているのは、Deferred が解決するのではなく拒否するべきかということです。より一般的には、いつ null オブジェクトのようなものに解決する必要があり、いつ拒否する必要があるのでしょうか?

2 つの位置を示すコードを次に示します。

// Resolve with null.
var promise = form.open()
    .done(function (result) {
        if (result) {
            // Do something with result.
        } else {
            // Log lack of result.
        }
    });

// Reject.
var promise = form.open()
    .done(function (result) {            
        // Do something with result.            
    })
    .fail(function () {
        // Log lack of result.
    });
4

3 に答える 3

4

2 つの戦略のセマンティクスは実際には同じではありません。deferred を明示的に拒否することには意味があります。

たとえば、$.when()は、渡された遅延オブジェクトが成功する限り結果を蓄積し続けますが、失敗した最初のオブジェクトで救済します。

つまり、2 つの promise の名前promise1promise2それぞれ変更すると、次のようになります。

$.when(promise1, promise2).then(function() {
    // Success...
}, function() {
    // Failure...
});

上記のコードは、最初のフォームがキャンセルされた場合でも、 に渡されたコールバックの 1 つを呼び出す前に、2 番目のフォームが閉じられるまで待機しますthen()。呼び出されたコールバック (成功または失敗) は、2 番目のフォームの結果のみに依存します。

ただし、そのコードは、最初のフォームが閉じられるのを待たずに、2 番目のフォームがキャンセルされた場合に失敗のコールバックを呼び出します。

于 2013-02-12T21:03:25.517 に答える
2

ユーザー制御なので、「失敗」とは見なしません。最初のオプションはよりきれいに見えます。

于 2013-02-12T20:57:29.620 に答える
0

どちらの場合も、何か違うことをすることになるので、常に解決するか拒否するかのどちらかだと思います。解決時にフォーム投稿を行い、拒否時に何もしません。次に、常にフォームを閉じます。

var promise = form.open()
.done(function (result) {            
    // Do something with result.            
})
.fail(function () {
    // Log lack of result.
})
.always(function() {
    // close the form.
})

キャンセル時に拒否していない場合、いつ拒否したことがありますか? その時点で、なぜ遅延オブジェクトを使用するのでしょうか? 入力エラーで拒否することもできますが、修正を許可したい場合は、まったく新しい promise を生成する必要があります。


Deferred は、ここで使用するのが適切ではないようです。イベントを使用するだけです。

于 2013-02-12T20:57:49.253 に答える