【问题标题】:Call another HTTp request inside after an HTML request in an angular service在角度服务中的 HTML 请求之后在内部调用另一个 HTTP 请求
【发布时间】:2019-08-22 06:58:10
【问题描述】:

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

      }
    });

【问题讨论】:

    标签: angular rxjs pipe subscribe switchmap


    【解决方案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;
        })
      );
    }
    

    【讨论】:

    • 感谢您的解释和代码。应用后出现错误。但是,我正在尝试自己摆脱这些错误。我将评论下面的错误仅供您参考。 :-)
    • src/app/main/services/application.service.ts(1310,5) 中的错误:错误 TS2322:类型 'Observable' 不可分配给类型 'Observable'。输入'布尔| ApplicationHeader' 不可分配给类型 'boolean'。类型“ApplicationHeader”不可分配给类型“布尔”。 src/app/main/services/application.service.ts(1314,9): 错误 TS2322: 类型 'boolean | ApplicationHeader' 不可分配给类型 'ApplicationHeader'。类型“false”不可分配给类型“ApplicationHeader”。
    • 抱歉打错了。 updateStudentAssessmentStatus 的 reurn 类型应该是 Observable,而不是 Observable。并且您知道更新和以下 get 是成功的,因为返回的 observable 没有发出错误。不是因为它发出一个布尔值。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-09
      • 1970-01-01
      • 2018-03-02
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      相关资源
      最近更新 更多