非同期呼び出しの問題を解決する必要があります。 シナリオ:
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); });
}
はその後、私はこの変更(問題はコードで記述されている)を作ってみました。
グランドメルシー:)あなたのヒントは、私の質問に表示された状態をブロック解除しました。いくつかの技術提案:Observable.of(result);を返す代わりに、 'Observable'である' result'だけを返す方が良い。このようにして、追加のラッパーを作成することを避けることができます。 'catch(err =>)'ブロックからObservable.of({});を実行すると '.catch(err => {return Observable.throw(err);})'と入力できます。ボン・ジャーニー! – meorfi