ほとんどのAPIリクエスト/呼び出しで送信されるログインCookieを使用してユーザーを確認するアプリがあります。(ログインに成功すると、サーバーによって設定されます。)
問題は、私のアプリが起動時に同時に一連のapi呼び出しを実行しているため、無効なセッションIDを持つ呼び出しが発生し、それらの呼び出しごとにサーバー側で再作成されるため、セッションIDが異なる=>ユーザーがログに記録されることです。アウト。
私の計画は、お互いが許可される前に1つのAPI呼び出しを送信することです。しかし、どういうわけか私はそれを正しい順序で動作させることができません。
私は、ラッパーコンストラクターで最初の呼び出しが終了した後に解決される約束を思いつきました。
private firstCallMade: Promise<any>;
constructor(
private http: HttpClient,
private settings: SettingsProvider)
{
this.settings.getAsyncString("apiEndpoint").then(res =>
{
this.apiUrl = res;
this.firstCallMade = new Promise((resolve, reject) =>
{
this.http.get(this.apiUrl + this.firstCallEndpoint, { withCredentials: true })
.subscribe(
(result) => {
this.logger.system(this, 'First Call', `First call successful: ${JSON.stringify(result)}`);
resolve();
},
(error) => {
this.logger.system(this, 'First Call', `First call failed: ${JSON.stringify(error)}`);
resolve();
});
});
});
}
そして他のラッパーメソッドでは私はそれをそのように使用します
get<T>(endpoint: string): Observable<T>
{
return new Observable<T>(subscriber =>
{
this.firstCallMade.then(_ =>
{
this.http.get<T>(this.apiUrl + endpoint)
.subscribe(
next => subscriber.next(next),
error => subscriber.error(error));
});
});
}
しかし、これは機能しません。
私のコードは間違っていますか?
明確化のための編集必要なのはすべてですが、最初の呼び出しが終了した後、最初の呼び出しを同時に行うことができます(したがって、後続の呼び出しに適切なCookieデータを設定します)。
1 forkJoinは必要ありません、mergeMapまたはconcatMapが必要です、forkJoinは通常は悪いのですが、なぜですか?1つの要求が失敗すると、他のすべてが失敗するためです。
たとえば、mergeMapとconcatMapは、10個のリクエストの1つが失敗した場合、他の9個は終了を試み続けます。
mergeMapとconcatMapの違いは、リクエストの実行方法です。mergeMapでは、「ワンプッシュ」でサーバーに送信されます。つまり、10の日付をプルし、mergeMapで10の日付のリクエストを実行するとします。 concatMapがキューに新しいリクエストを追加するために前のリクエストが終了するのを待つ間、前のリクエストが終了するのを待たずに。
ここに「concatMap、mergeMap、forkJoinの使用方法」の例があります:https://angular-bojdob.stackblitz.io
これはトーマス(英語)からのものです:https://blog.angularindepth.com/practical-rxjs-in-the-wild-requests-with-concatmap-vs-mergemap-vs-forkjoin-11e5b2efe293
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加