在角度服务中的HTML请求之后,在内部调用另一个HTTp请求

时间:2019-08-22 06:58:10

标签: angular rxjs pipe subscribe switchmap

在某些角度服务中,我需要调用一个名为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 {

      }
    });

2 个答案:

答案 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()
    }
})