[解決済み] http インターセプターに $state (ui-router) を注入すると循環依存が発生する
2022-09-06 18:33:57
質問
実現したいこと
httpリクエストが401エラーを返した場合に、特定の状態(ログイン)に遷移させたいと考えています。そのため、$httpインターセプターを作成しました。
問題点
インターセプターに '$state' を挿入しようとすると、循環依存関係が発生します。なぜ、そしてどのように私はそれを修正するのですか?
コード
//Inside Config function
var interceptor = ['$location', '$q', '$state', function($location, $q, $state) {
function success(response) {
return response;
}
function error(response) {
if(response.status === 401) {
$state.transitionTo('public.login');
return $q.reject(response);
}
else {
return $q.reject(response);
}
}
return function(promise) {
return promise.then(success, error);
}
}];
$httpProvider.responseInterceptors.push(interceptor);
どのように解決するのですか?
修正方法
この場合
$injector
サービスへの参照を取得します。
$state
サービスへの参照を取得します。
var interceptor = ['$location', '$q', '$injector', function($location, $q, $injector) {
function success(response) {
return response;
}
function error(response) {
if(response.status === 401) {
$injector.get('$state').transitionTo('public.login');
return $q.reject(response);
}
else {
return $q.reject(response);
}
}
return function(promise) {
return promise.then(success, error);
}
}];
$httpProvider.responseInterceptors.push(interceptor);
原因
angular-ui-router
は
$http
サービスを依存関係として
$TemplateFactory
への循環参照を作成します。
$http
の中に
$httpProvider
の中で、インターセプターをディスパッチします。
を注入しようとすると、同じ循環依存性例外が発生します。
$http
サービスを直接インターセプターに注入しようとすると、同じ循環依存性例外が発生します。
var interceptor = ['$location', '$q', '$http', function($location, $q, $http) {
懸念事項の分離
循環依存性の例外は、アプリケーション内で懸念事項が混在していることを示すことがあり、安定性の問題を引き起こす可能性があります。この例外が発生した場合、自分自身を参照することになる依存関係を確実に回避するために、アーキテクチャを調べる時間を取る必要があります。
Stephen Friedrich の回答
私は、以下の回答に同意します。
$injector
を使用して目的のサービスへの参照を直接取得することは理想的ではなく、アンチパターンと見なされる可能性があります。
イベントを発行することは、よりエレガントで、かつ非連続なソリューションです。
関連
-
[解決済み] AngularJs ReferenceError: $http is not defined
-
処理されない例外が発生しました。Angular 実行中のプロジェクトで NGCC に失敗しました。
-
[解決済み] ngInject'を本当に書く必要があるのか?
-
[解決済み] AngularJs .$setPristineでフォームをリセットする
-
[解決済み] Jasmineの "callThrough "と "callFake() "の実用的な例が欲しい
-
[解決済み] AngularJS コントローラにおける 'this' と $scope の比較
-
[解決済み] ServiceとFactoryで迷う
-
[解決済み] AngularJSでコントローラを2回実行する場合の対処法
-
[解決済み] Angular HttpPromise: `success`/`error` メソッドと `then` の引数の違い。
-
[解決済み] AngularJS: HTTPインターセプターへのサービスインジェクション (円形依存)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AngularJs ReferenceError: $http is not defined
-
[解決済み] AngularJSでkeypressイベントを使用するには?
-
[解決済み] AngularJS : ローカルストレージを使用する
-
[解決済み] Angularのui-routerでデフォルトの状態を設定する方法
-
[解決済み] md-selectでデフォルト値を設定する方法
-
[解決済み] AngularJSの.$on()とは?
-
[解決済み] angularJSの::の意味するところ
-
[解決済み] AngularJS コントローラにおける 'this' と $scope の比較
-
[解決済み] コントローラでフィルタを使用するには?
-
[解決済み] AngularJS: HTTPインターセプターへのサービスインジェクション (円形依存)