繁体   English   中英

angular2可观察的:如何等待异步结果并返回另一个异步方法

[英]angular2 Observable: How to wait asynchronous result and return another asynchronous method

我必须解决异步调用的问题。 场景:
makeReservation方法返回Observable<SaveResponse> 当调用者调用makeReservation方法时应该做
1)调用send3DRequest并订阅它并等待success事件。
2)在success事件中获取必要的详细信息并返回另一个异步方法: return this.reservationHttpService.save(X)

在我的实际实现中,我得到一个错误: 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
} 

任何想法都将受到欢迎:)谢谢。

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

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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM