をお試しください
オプション1 - ブレーク/ ca ncel promise chain
HttpInterceptor
の小さな変更は、プロミスチェーンを中断/キャンセルすることができます。つまり、コントローラーのactivateOk
またはactivateError
が実行されません。
function HttpInterceptor($q, $location) {
var service = {
responseError: responseError
};
return service;
function responseError(rejection) {
if (rejection.status === 404) {
$location.path('/error');
return $q(function() { return null; })
}
return $q.reject(rejection);
}
}
ラインreturn $q(function() { return null; })
は、約束を破棄します。
"ok"かどうかは議論のテーマです。 「You don't know JS」のカイル・シンプソンの状態:
多くの約束抽象化ライブラリは 約束をキャンセルする機能を提供しますが、これはひどいアイデアです!多くのデベロッパーは、 が外部取り消し機能をネイティブに設計されたことを願っていますが、 という問題は、1人の消費者/オブザーバーがPromise を同じプロミスを観察する他の消費者の能力に影響させるということです。 これは、将来の価値のtrustability(外部不変性)に違反 が、moreverは アンチパターン...
良い「距離でアクション」の実施例でありますか?悪い?私が言うように、それは議論の話題です。私はそれが既存の$http
消費者に何の変更も必要としないという事実を好む。
カイルの彼が言うときかなり右:
多くの約束抽象化ライブラリは約束をキャンセルする機能を提供...
例えばブルーバード約束ライブラリが取り消しをサポートしています。 the documentationから:
新しいキャンセルは古い キャンセルが意味を中止していた間、セマンティクスを「気にしない」があります。約束を取り消すと、そのハンドラのコールバックが呼び出されないことを単に意味する を意味します。
オプション2 - 異なる抽象
約束は、比較的広い抽象化です。 Promises/A+ specificationから:
約束非同期動作の最終的な結果を示します。
角度$http
サービスは、非同期のHTTPリクエストの最終的な結果のための約束を返すように約束の$q
実装を使用します。
それは$http
が返された約束を飾るtwo deprecated functions、.success
と.error
を、持っている価値は何もありません。これらの関数は、標準的な方法で連鎖可能ではなく、 "HTTP固有の"関数のセットとして多くの価値を追加しないと考えられていたため、非難されました。
しかし、これは、$http
で使用されている基本的な約束を公開しない独自のHTTP抽象化/ラッパーを作ることはできません。このように:
function HttpWrapper($http, $location) {
var service = {
get: function (getUrl, successCallback, errorCallback) {
$http.get(getUrl).then(function (response) {
successCallback(response);
}, function (rejection) {
if (rejection.status === 404) {
$location.path('/error');
} else {
errorCallback(rejection);
}
});
}
};
return service;
}
これは約束を返さないということなので、その消費量は異なり、あまりにも少し作業する必要があります。
HttpWrapper.get('non-existent-location', getSuccess, getError);
function getSuccess(response) {
alert('Everything is ok');
}
function getError(error) {
alert('An error happened');
}
を404の場合は、場所は 'に変更されますエラー 'となり、getSuccess
とgetError
のコールバックは実行されません。
この実装は、HTTPリクエストをチェーン化する機能がもう利用できないことを意味します。それは容認できる妥協ですか?結果は異なる場合があります...
オプション3 - 彼のコメントをTJに拒否
クレジットを飾る:
あなたが特定のコントローラでのエラー処理が必要な場合、あなたはエラーが処理されたかどうかを確認するために 条件が必要になります インターセプター/サービスなど
でHTTPのインターセプターは、私かどうかを示すために、プロパティhandled
と約束拒絶反応を飾ることができますtはエラーを処理しました。
function HttpInterceptor($q, $location) {
var service = {
responseError: responseError
};
return service;
function responseError(rejection) {
if (rejection.status === 404) {
$location.path('/error');
rejection.handled = true;
}
return $q.reject(rejection);
}
}
コントローラは、その後、次のようになります
$http.get('non-existent-location')
.then(function activateOk(response) {
alert('Everything is ok');
})
.catch(function activateError(error) {
if (!error.handled) {
alert('An error happened');
}
});
概要
とは異なり、オプション2、オプション3はまだ意味で肯定的であるチェーンの約束への$http
消費者のためのオプションを残しそれは機能性を排除していないということです。
オプション2と3のどちらも、「離れた場所での行動」はあまりありません。オプション2の場合、別の抽象化によって、通常の$q
実装とは異なる動作が行われることが明らかになります。そして、オプション3については、消費者はそれでも満足する約束を受けます。
多かれ少なかれシナリオを処理するグローバルエラーハンドラを変更しても、コンシューマに変更を加える必要がないため、3つのオプションすべてが保守性基準を満たします。
私はこれを疑問に思いましたが、それを忘れました。 D –