0

我必须进行 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');
});
4

2 回答 2

1

concat您可以使用该函数按顺序运行多个可观察对象。

concat(
  obs1$,
  obs2$
).subscribe(result => {
  console.log(result);
});

如果每个 observable 返回 1 个结果并完成(一个 http 请求),则 subscribe 将收到 2 个值 - 的结果,obs1$然后是 的结果obs2$

如果要等待两者都返回结果,可以使用该toArray函数。

concat(
  obs1$,
  obs2$
).pipe(
  toArray()
).subscribe(result => {
  console.log(result);
});

obs1$订阅中的结果现在将是结果和结果的数组obs2$

您的要求有点复杂,因为您有一个初始可观察对象,然后是一组可观察对象。如果你想按顺序运行你的 observables 数组,那么你可以预先创建 observables 数组并将它们传递给 concat。

const trailerComparisons$ = this.trailerComparisons.map(c => 
  this.trailerComparisonService.saveReviewComplete(c.trailerComparisonId)
);

concat(
  this.updateUserCommentsObservable(),
  ...trailerComparisons$
).pipe(
  toArray()
).subscribe(/* subscribe handling */)

演示:https ://stackblitz.com/edit/angular-jldrrh

于 2020-03-13T07:50:21.847 回答
0

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

https://rxjs-dev.firebaseapp.com/api/operators/concatMap

于 2020-03-13T06:36:23.773 回答