[英]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
方法返回类型为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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.