[解決済み] デフォルトと特定のリクエストタイムアウト
2023-07-09 07:59:45
質問
通常、デフォルトのタイムアウト (例: 30s) がすべてのリクエストに適用され、特定の より長い (例: 600s) に上書きすることができます。
でデフォルトのタイムアウトを指定する良い方法はありません。
Http
サービスのデフォルトタイムアウトを指定する良い方法はありません。
でこれをアプローチする方法は何でしょうか?
HttpClient
サービスではどのようにアプローチするのでしょうか?すべての送信リクエストに対してデフォルトのタイムアウトを定義し、特定のものに対してオーバーライドできるようにするにはどうすればよいでしょうか?
どのように解決するのですか?
を拡張しないと
HttpClientModule
クラスを拡張しなければ、インターセプターがそれぞれのリクエストと通信するために期待される唯一の方法は
params
と
headers
オブジェクトを作成します。
タイムアウトの値はスカラーなので、インターセプターへのカスタムヘッダとして安全に提供することができ、そこで、RxJSを介して適用されるべきデフォルトまたは特定のタイムアウトを決定することができます
timeout
演算子によって適用されます。
import { Inject, Injectable, InjectionToken } from '@angular/core';
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs';
import { timeout } from 'rxjs/operators';
export const DEFAULT_TIMEOUT = new InjectionToken<number>('defaultTimeout');
@Injectable()
export class TimeoutInterceptor implements HttpInterceptor {
constructor(@Inject(DEFAULT_TIMEOUT) protected defaultTimeout: number) {
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const timeoutValue = req.headers.get('timeout') || this.defaultTimeout;
const timeoutValueNumeric = Number(timeoutValue);
return next.handle(req).pipe(timeout(timeoutValueNumeric));
}
}
のように、アプリモジュールで設定できます。
providers: [
[{ provide: HTTP_INTERCEPTORS, useClass: TimeoutInterceptor, multi: true }],
[{ provide: DEFAULT_TIMEOUT, useValue: 30000 }]
],
リクエストは、カスタム
timeout
ヘッダ
http.get('/your/url/here', { headers: new HttpHeaders({ timeout: `${20000}` }) });
ヘッダーは文字列であることが前提なので、まずタイムアウトの値を文字列に変換する必要があります。
以下は デモ .
でインターセプターを使用するアイデアを提案してくれた @RahulSingh と @Jota.Toledo に感謝します。
timeout
.
関連
-
[解決済み] コンストラクタとngOnInitの違いについて
-
[解決済み] Angular 2+でngShowとngHideに相当するものは何ですか?
-
[解決済み] オブジェクトのキーと値に*ngForでアクセスする
-
[解決済み] Angular - すべてのリクエストにヘッダを設定する
-
[解決済み】PromiseとObservablesの違いは何ですか?
-
[解決済み】*ngIfと*ngForが同じ要素にあるとエラーになる件
-
[解決済み】Angular - サービスとコンポーネントでパイプを使用する
-
[解決済み] AngularでEventEmitterに2つのパラメータを渡すには?
-
[解決済み] 遅延のあるobservableを作成するには?
-
[解決済み] Angular 2で送信後にフォームをクリアするには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ng buildの後にangular-cliのdist-folderのパスを変更するには?
-
[解決済み] Angular 2: 反応するフォームコントロールの反復処理
-
[解決済み] Angular 2のFormGroupからすべての検証エラーを取得する
-
[解決済み] ng2 - ng-containerタグとng-templateタグの違い
-
[解決済み] Error: モジュールによってインポートされた予期しない値 'undefined'。
-
[解決済み] FormGroupとFormArrayの使い分けは?
-
[解決済み] どのようにしてangular 4のurlからparamを取得するのですか?
-
[解決済み] 64進数の文字列を角(2+)でエンコードおよびデコードする。
-
[解決済み] の@ViewChildのreadパラメータは何ですか?
-
[解決済み] Uncaught Error: Unexpected module 'FormsModule' declared by the module 'AppModule'. Pipe/@Directive/@Component アノテーションを追加してください。