如何创建一个本身调用HTTP方法的可观察方法



我正在尝试创建一个更新记录的服务。正常的httpPut调用工作正常,但我想订阅save方法并等待save方法完成,就像http调用一样。

54844328-这篇文章似乎真的很接近我需要的,但显然我没有正确地做到这一点。

如有任何帮助,我们将不胜感激。

save(href, recordModel): Observable<boolean> {
let returnValue = true;
return new Observable((observer ) => {
this.dataService.httpPut(href, recordModel).subscribe(resp => {
returnValue = true;
},
(resp) => {
this.statusError('put()');
returnValue = false;
});
this.logger.info('save', returnValue);
observer.next(returnValue);
observer.complete();
});
}

this.dynamicListsService.save(this.editModel._links.self.href, this.editModel).subscribe(resp => {
if (resp) {
this.dynamicListsData = this.dynamicListsService.getAll();
this.setAppMessage(appMessages.recordSaved);
this.logger.debug("APP GOOD");
} else {
this.logger.debug("APP BAD");
super.dialogError();
}
});

new Observable构造函数是一个反模式,以防您想从现有的可观察对象创建可观察对象,就像您在问题中所做的那样。最好使用正确的运算符,我们在rxjs中有很多这样的运算符。该代码的行为应该与问题中的行为完全相同,但具有固定的logger.info,因为它将在正确的时刻执行

save(href, recordModel): Observable<boolean> {
let returnValue: boolean;
this.dataService.httpPut(href, recordModel).pipe(
map(() => returnValue = true),
catchError(() => {
this.statusError('put()');
return of(returnValue = false);
}),
finalize(() => this.logger.info('save', returnValue)) 
);
}

您需要将observer.next()放入订阅中。现在,您的observer将在httppost调用有机会完成之前被调用,因为它发生在订阅之外。

接下来,您可以将错误处理程序添加到订阅中,并确保激发observer.error()调用,以将该错误放大为使用该函数的任何错误。

最新更新