2016-11-07 12 views
0

非同期呼び出しの問題を解決する必要があります。 シナリオ:
makeReservationメソッドはObservable<SaveResponse>を返します。 makeReservationメソッドが呼び出し元によって呼び出されたとき
1)send3DRequestを呼び出してそれにサブスクライブし、successイベントを待ちます。
2)successイベントに必要な詳細情報を取得し、別の非同期メソッドを返す:私の実際の実装ではreturn this.reservationHttpService.save(X)angular2 Observable:非同期の結果を待って別の非同期メソッドを返す方法

を私はエラーを取得:Return statement is required for non-void return type

private makeReservation(reservationDto: ReservationDTO): Observable<SaveResponse>{ 

    let saveResponse = new Observable<SaveResponse>(); //added change 

    this.reservationHttpService.send3DRequest(reservationDto.threeDQueryDetails) 
    .subscribe(
     successResponse => { 
     if(successResponse.enrolled === 'Y'){ 
      reservationDto.transRef = successResponse.transactionRef; 
      reservationDto.acsUrl = successResponse.acsUrl; 
      reservationDto.paReq = successResponse.paReq; 

      let result = this.reservationHttpService.save(reservationDto); 
      //HOW TO INSERT the result in saveResponse and notify about change ? 
     } 
     else { 
      reservationDto.transRef = successResponse.transactionRef; 
      let result = this.reservationHttpService.save(reservationDto); 
      //HOW TO INSERT the result in saveResponse and notify about change ? 
     }   
     }, 
     error => { throw new Error(error); }); 

    return saveResponse; //added change 
} 

すべてのアイデアは歓迎されているでしょう:) ありがとう: -

private makeReservation(reservationDto: ReservationDTO): Observable<SaveResponse>{ 
    this.reservationHttpService.send3DRequest(reservationDto.threeDQueryDetails) 
    .subscribe(
     successResponse => { 
     if(successResponse.enrolled === 'Y'){ 
      reservationDto.transRef = successResponse.transactionRef; 
      reservationDto.acsUrl = successResponse.acsUrl; 
      reservationDto.paReq = successResponse.paReq; 

      return this.reservationHttpService.save(reservationDto); 
     } 
     else { 
      reservationDto.transRef = successResponse.transactionRef; 

      return this.reservationHttpService.save(reservationDto); 
     }   
     }, 
     error => { throw new Error(error); }); 
} 

はその後、私はこの変更(問題はコードで記述されている)を作ってみました。

答えて

1

あなたのメソッドの定義に見てみる場合:

private makeReservation(reservationDto: ReservationDTO): Observable<SaveResponse> 

あなたはmakeReservation方法がタイプSaveResponseObservableを返すことを期待しています。しかし、あなたはここで何も返さない。

あなたはちょうどreservationHttpService.send3DRequestで購読し始めます。

あなたはかなり持っている必要があります。

private makeReservation(reservationDto: ReservationDTO): Observable<SaveResponse>{ 
    return this.reservationHttpService.send3DRequest(reservationDto.threeDQueryDetails) 

を(リターンに気づきます)。


我々は(おそらく最高のアイデアです)、あなたの第二の例から始めるのであれば、今、私のような何かをしたい:

private makeReservation(reservationDto: ReservationDTO): Observable<SaveResponse>{ 
    return this 
    .reservationHttpService 
    .send3DRequest(reservationDto.threeDQueryDetails) 
    .switchMap(response => { 
     let result; 

     if(successResponse.enrolled === 'Y') { 
      reservationDto.transRef = successResponse.transactionRef; 
      reservationDto.acsUrl = successResponse.acsUrl; 
      reservationDto.paReq = successResponse.paReq; 

      result = this.reservationHttpService.save(reservationDto); 
     } 

     else { 
      reservationDto.transRef = successResponse.transactionRef; 
      result = this.reservationHttpService.save(reservationDto); 
     } 

     return Observable.of(result); 
     } 
    ) 
    .catch(err => { 
     // handle your error here 
     return Observable.of({}); 
    }) 
} 

をし、ちょうどmakeReservationに登録することを忘れないでくださいあなたはそれを呼び出すとき:

this.makeReservation(your_argument).subscribe();

+0

グランドメルシー:)あなたのヒントは、私の質問に表示された状態をブロック解除しました。いくつかの技術提案:Observable.of(result);を返す代わりに、 'Observable'である' result'だけを返す方が良い。このようにして、追加のラッパーを作成することを避けることができます。 'catch(err =>)'ブロックからObservable.of({});を実行すると '.catch(err => {return Observable.throw(err);})'と入力できます。ボン・ジャーニー! – meorfi

関連する問題