1. ホーム
  2. angular

[解決済み] デフォルトと特定のリクエストタイムアウト

2023-07-09 07:59:45

質問

通常、デフォルトのタイムアウト (例: 30s) がすべてのリクエストに適用され、特定の より長い (例: 600s) に上書きすることができます。

でデフォルトのタイムアウトを指定する良い方法はありません。 Http サービスのデフォルトタイムアウトを指定する良い方法はありません。

でこれをアプローチする方法は何でしょうか? HttpClient サービスではどのようにアプローチするのでしょうか?すべての送信リクエストに対してデフォルトのタイムアウトを定義し、特定のものに対してオーバーライドできるようにするにはどうすればよいでしょうか?

どのように解決するのですか?

を拡張しないと HttpClientModule クラスを拡張しなければ、インターセプターがそれぞれのリクエストと通信するために期待される唯一の方法は paramsheaders オブジェクトを作成します。

タイムアウトの値はスカラーなので、インターセプターへのカスタムヘッダとして安全に提供することができ、そこで、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 .