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