等待一个可观察对象检索数据,然后再执行另一个

时间:2020-08-01 17:40:14

标签: javascript angular typescript

我有这两个http呼叫:

const newProject = this.newProjectForm.value;
newProject.stage = "In progress";

let newProjectFromServer: IProject;

this.projectService.addProject(newProject).subscribe((data) => {
  newProjectFromServer = data;
});

this.projectService
  .addEmployeesToProject(
    newProjectFromServer.id,
    newProject.assignedEmployees
   )
   .subscribe(() => {
     this.afterSubmit();
   });

第一个将项目添加到数据库,因此Spring对其应用ID,因此在作为响应得到的数据中,它现在应该具有ID。 然后,我尝试添加从表单中获取的已分配员工的数组。 问题在于newProjectFromServer.id参数是未定义的,因为我认为它是同步读取的

编辑:这是addEmployeesToProject函数:

addEmployeesToProject(
    projectId: number,
    employees: IEmployee[]
  ): Observable<IEmployee[]> {
    return this.httpClient.post<IEmployee[]>(
      `${this.baseUrl}/${projectId}/employees`,
      {
        _embedded: { employees },
      }
    );
  }

Api结果:

{
"_embedded": {
     "employees": [] // IEmployee[] array doesnt get save
   },
   "_links": {
     "self": {
      "href": "http://localhost:8080/api/projects/26/employees"
     }
   }
 }

添加项目请求:

addProject(project: IProject): Observable<IProject> {
    return this.httpClient.post<IProject>(this.baseUrl, project);
  }

3 个答案:

答案 0 :(得分:0)

使用switchMap运算符可以使这种事情起作用

this.projectService.addProject(newProject).pipe(
  tap(data => newProjectFromServer = data),
  switchMap(() => {
    return this.projectService.addEmployeesToProject(
    newProjectFromServer.id, 
    newProject.assignedEmployees
  )}
).subscribe((secondResult) => {
   this.afterSubmit()
});

我希望它能帮上忙。

有关switchMap运算符的研究链接:

https://www.learnrxjs.io/learn-rxjs/operators/transformation/switchmap

答案 1 :(得分:0)

您可以使用 concatMap,switchMap,mergeMap 。建议使用 concatMap ,因为它可以确保顺序执行HTTP调用。

this.projectService.addProject(newProject).pipe(
  concatMap((newProjectFromServer) => {            
    this.projectService.addEmployeesToProject(
       newProjectFromServer.id, 
       newProject.assignedEmployees
    )}
).subscribe((secondResult) => {
   this.afterSubmit()
});

答案 2 :(得分:-1)

我认为一种更好的方法是将其转化为承诺:

public async myFunc(): Promise<void> {
const newProjectFromServer = await this.projectService.addProject(newProject).toPromise()

await this.projectService
  .addEmployeesToProject(
    newProjectFromServer.id,
    newProject.assignedEmployees
   ).toPromise();
this.afterSubmit();
}
相关问题