我正在尝试创建一个更新记录的服务。正常的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()
调用,以将该错误放大为使用该函数的任何错误。