2016-11-07 150 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>{ 
    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); }); 
} 

-

然后,我试图让这种变化(问题的代码中描述)

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 
} 

任何想法会欢迎:) 感谢。

回答

1

如果你看一下你的方法定义:

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

您希望makeReservation方法返回SaveResponse类型的Observable。但你在这里没有任何回报。

您刚开始订阅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

大MERCI :)你的暗示解封我的问题所显示的状态。一些技术建议:不要返回'Observable.of(result);'最好只返回已经是'Observable'的'result'。这样我们可以避免创建一个额外的包装。对于'Observable.of({});'from catch(err =>)'块可以输入:'.catch(err => {return Observable.throw(err);})'。 Bonne journee! – meorfi