私はObservableを作成してサーバーからユーザーを取得し、一意のユーザーのみを取得してキャッシュすることでパフォーマンスを向上させようとしています。また、すべてのユーザーが返されたら、ユーザーの配列を更新するためにforkjoinを使用しています。Forkjoin on SwitchMapはサブスクリプション後に返信しません
まず私は、サービスコールを使用して、サーバーからユーザーを取得しています:
getUsersById(user_ids: number[]): Observable<User[]> {
return Observable.forkJoin(user_ids.map(x => this.getUserById(x)));
}
これは、それがキャッシュに存在するかする必要がある場合に応じて、オブジェクトに対して、観察を返す次の関数を使用していますサーバーから取得します。
public getUserById(user_id: number): Observable<User> {
let tmpUser = this.users.find(x => x.id == user_id);
if (tmpUser != null) {
return Observable.of(tmpUser);
} else {
// Get Token From Cognito Session
return this.cognito.getIdToken()
.flatMap(token => {
// Convert token into Header and retrieve from server
let headers = this.getAuthHeader(token);
return this.http
.get(`${this.userURL}/${user_id}`, {headers: headers})
.map((response) => response.json())
.map(result => {
let newUser = new User();
newUser.deserialize(result);
this.users.push(newUser);
return newUser;
});
});
}
}
次のようにサービスが呼び出すコンポーネントのコード:
ngOnChanges() {
if(this.reports.length != 0) {
// Get users for reports
let users = this.reports.map(
x => {
return x.user_id;
});
// Get unique users
let uniqueUsers = users.filter(function (item, i, ar) {
return ar.indexOf(item) === i;
});
// Make call (ForkJoin) and wait for all to return
this.userService.getUsersById(uniqueUsers).subscribe(
users => {
// Add users to user array
this.users = this.reports.map(report => {
return users.find(user => user.id === report.user_id);
});
this.reportsUpdate.emit(this.reports);
}, err => {
console.log(err);
});
}
}
私が午前問題はForkJoin私はgetUserByIdコールが実行されていることを確認することができていても返すことはありませんということです完了して値を返します。私はかなり混乱しているし、スイッチマップとフラットマップの両方を試しましたが、私はその違いについて完全にはわかっていません。
** EDITは
getIdTokenのコードは、以下の私は、プログラムが行を打つんことを確認した
public getIdToken(): Observable<string> {
return Observable.create(
(observer: Observer<string>) => {
let cognitoUser = this.getCurrentUser();
if (cognitoUser != null) {
cognitoUser.getSession((err, session) => {
if (err) {
console.log(err);
observer.error(err);
} else {
if (session.isValid()) {
observer.next(session.getIdToken().getJwtToken());
}
}
});
} else {
observer.error('Failed To Retrieve Id Token');
}
});
};
getCurrentUser() {
return this.getUserPool().getCurrentUser();
}
です**:
observer.next(session.getIdToken() .getJwtToken());
だから、オブザーバー完了していないが、問題はcognito.getIdToken()の呼び出しでいた問題
以下のようにそれが動作しません.cognito.getIdToken() 'observableは完了しません。 – cartant
私はcognitoサービスの内容に関する投稿を更新し、observer.next()行に当たることを確認しました。だから私が間違ってそこから戻ってきて、問題ではないと思わない限り、 –
次の呼び出しが完了するのと同じでないかもしれないことに気がついたので、getIdTokenへの完全な呼び出しを追加しました。答えを見つけるために正しい方向に私を押してくれてありがとう:) –