1

在一些角度服务中,我需要调用一个名为的 PUT 方法,完成后我需要调用另一个 GET 方法。然后 GET 方法的结果应该存储在服务本身的变量中。

我写的代码有一些问题。因为当我从组件调用服务时,isUpdateSuccess 在组件中显示为未定义。

在这里,我不需要将“应用程序”对象传递给组件。我只需要将 ApplicationStatusModel 作为 observable 传递。但是如上所述,我需要将应用程序对象保存到名为 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 {

      }
    });
4

2 回答 2

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;
    })
  );
}
于 2019-08-22T07:08:50.377 回答
0

您可以在第一次订阅 http 时使用 .pipe() 。

return your-First-Http-Request().pipe(tap((res: your response) => {

        your-First-Http-Request()
    }
})
于 2020-06-12T06:36:18.237 回答