Angular 按顺序订阅多个服务调用

Angular 按顺序订阅多个服务调用,angular,typescript,rxjs,observable,mergemap,Angular,Typescript,Rxjs,Observable,Mergemap,我必须做2个api调用,我希望第一个调用完成,然后第二个调用按顺序开始。第二次呼叫对第一次呼叫没有任何依赖性。这两个调用都会对数据库进行更新。 如果我使用下面的代码,第二次调用的更新会发生多次,因此它会尝试多次更新同一记录,我希望避免。任何帮助都将不胜感激 updateUserCommentsObservable(): Observable<any> { if (!this.userComments) { return EMPTY; } const source

我必须做2个api调用,我希望第一个调用完成,然后第二个调用按顺序开始。第二次呼叫对第一次呼叫没有任何依赖性。这两个调用都会对数据库进行更新。 如果我使用下面的代码,第二次调用的更新会发生多次,因此它会尝试多次更新同一记录,我希望避免。任何帮助都将不胜感激

updateUserCommentsObservable(): Observable<any> {
  if (!this.userComments) {
    return EMPTY;
  }

  const source = this.arrayGroupBy<TrailerComparisonUserComment>(
    this.userComments, 
    comment => comment.trailerComparisonId);
  return from(Object.keys(source)).pipe(
    mergeMap(x => this.trailerComparisonService.updateUserComments(
      x, source[x])
    )
  );
}


this.updateUserCommentsObservable().pipe(
  flatMap(() => from(this.trailerComparisons).pipe(
    mergeMap(trailerComparison => 
      this.trailerComparisonService.saveReviewComplete(
        trailerComparison.trailerComparisonId))
    )
  )
).subscribe(() => {                   
  this.userComments = [];
  this.disableStage1Review = true;
  let snackBarRef = this.snackBar.open('Well done! Stage1 Review Complete has been successfully saved.', 'Dismiss');                   
}, error => {                   
  console.log("Error", error);
  let snackBarRef = this.snackBar.open('Error! ' + error.error.message, 'Dismiss');
});
updateUserCommentsObservable():可观察{
如果(!this.userComments){
返回空;
}
const source=this.arrayGroupBy(
这个.userComments,
comment=>comment.trailerComparisonId);
从(Object.keys(source)).pipe返回(
mergeMap(x=>this.trailerComparisonService.updateUserComments(
x、 来源[x])
)
);
}
此.updateUserCommentsObservable()管道(
平面图(()=>来自(this.trailerComparations).pipe(
合并映射(trailerComparison=>
this.trailerComparisonService.saveReviewComplete(
trailerComparison.trailerComparisonId)
)
)
).subscribe(()=>{
this.userComments=[];
this.disableStage1Review=true;
让snackBarRef=this.snackBar.open('做得好!已成功保存Stage1审阅完成','驳回');
},错误=>{
console.log(“错误”,Error);
让snackBarRef=this.snackBar.open('Error!'+Error.Error.message,'disease');
});

要按顺序进行呼叫,必须使用
concatMap
而不是
mergeMap


您可以使用
concat
功能按顺序运行多个观测值

concat(
obs1元,
obs2$
).订阅(结果=>{
控制台日志(结果);
});
如果每个observable返回1个结果并完成(http请求),则subscribe将收到2个值—结果是
obs1$
,结果是
obs2$

如果要等待两者都返回结果,可以使用
toArray
功能

concat(
obs1元,
obs2$
).烟斗(
toArray()
).订阅(结果=>{
控制台日志(结果);
});
订阅中的结果现在将是一个包含
obs1$
result和
obs2$
result的数组

您的需求要复杂一些,因为您有一个初始的可观察对象,然后是一组可观察对象。如果您想按顺序运行您的观察值数组,那么您可以预先创建观察值数组并将其传递到concat中

const-trailercomparations$=this.trailercomparations.map(c=>
this.trailerComparisonService.saveReviewComplete(c.trailerComparisonId)
);
海螺(
this.updateUserCommentsObservable(),
…追踪者$
).烟斗(
toArray()
).订阅(/*订阅处理*/)
演示: