2017-06-10 2 views
0

私は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()の呼び出しでいた問題

+0

以下のようにそれが動作しません.cognito.getIdToken() 'observableは完了しません。 – cartant

+0

私はcognitoサービスの内容に関する投稿を更新し、observer.next()行に当たることを確認しました。だから私が間違ってそこから戻ってきて、問題ではないと思わない限り、 –

+0

次の呼び出しが完了するのと同じでないかもしれないことに気がついたので、getIdTokenへの完全な呼び出しを追加しました。答えを見つけるために正しい方向に私を押してくれてありがとう:) –

答えて

0

であることは表示されません。私は呼び出されたときにトークンの価値を放出していたオブザーバブルを書いていました。問題は、私は後に呼び出しを追加した)Observable.next()関数はObservable.complete(同じではないということであると問題が `この可能性が最も高い

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()); 
       observer.complete(); // NEW LINE HERE!!! 
      } 
      } 
     }); 
     } else { 
     observer.error('Failed To Retrieve Id Token'); 
     } 
    }); 
}; 
関連する問題