在某些角度服务中,我需要调用一个名为PUT的方法,完成后我需要调用另一个GET方法。然后,GET方法的结果应存储在服务本身的变量中。
我编写的代码有一些问题。因为当我从组件调用服务时,isUpdateSuccess在组件中显示为未定义。
在这里,我不需要将“ application”对象传递给组件。我只需要将ApplicationStatusModel传递为可观察的。但是如上所述,我需要将应用程序对象保存到名为myApplication的变量中。
我读了几篇文章,也阅读了一些Stackoverflow帖子。还没有运气。
服务
private myApplication: ApplicationHeader;
updateStudentAssessmentStatus(model: ApplicationStatusModel): Observable<boolean> {
const data = this.svcHttp.put<boolean>(`${this.routePrefix}/${model.studentID}/applicationAssessmentStatus`, model)
.pipe(
switchMap(() => this.getApplicationHeaderById(model.studentID)
.pipe(map(application => {
console.log(`Application from update status ${JSON.stringify(application)}`);
this.myApplication = application;
})))
);
return data;
}
组件(称为“ updateStudentAssessmentStatus”)
this.svcApplication.updateStudentAssessmentStatus(statusModel).subscribe((isUpdateSuccess: boolean) => {
//isUpdateSuccess is NULL here.
if (!isUpdateSuccess) {
} else {
}
});
答案 0 :(得分:1)
map()
用于将事件转换为其他事件。您目前正在使用它将ApplicationHeader转换为undefined
,因为您没有从地图回调中返回任何内容。
要产生副作用,tap()
是您所需要的。
您也不需要太多嵌套。
private myApplication: ApplicationHeader;
updateStudentAssessmentStatus(model: ApplicationStatusModel): Observable<ApplicationHeader> {
return this.svcHttp.put<boolean>(`${this.routePrefix}/${model.studentID}/applicationAssessmentStatus`, model).pipe(
switchMap(() => this.getApplicationHeaderById(model.studentID)),
tap(application => {
console.log(`Application from update status ${JSON.stringify(application)}`);
this.myApplication = application;
})
);
}
答案 1 :(得分:0)
您可以在首次订阅HTTP时使用.pipe()。
return your-First-Http-Request().pipe(tap((res: your response) => {
your-First-Http-Request()
}
})