Angular 使用两个观测值是否创造了竞争条件?

Angular 使用两个观测值是否创造了竞争条件?,angular,observable,Angular,Observable,我有一个角度组件,它从服务器中提取数据以填充下拉列表,并从路由中提取参数以在下拉列表中设置所选选项。这一切都是在ngOnInit()中完成的。因为这两个选项都使用可观察值,所以我的解决方案是否会有一个竞争条件,在填充选项之前可以设置下拉选择值 从'@angular/core'导入{Component,OnInit}; 从'@angular/forms'导入{AbstractControl,FormBuilder,FormGroup,NgForm}; 从'@angular/router'导入{Ac

我有一个角度组件,它从服务器中提取数据以填充下拉列表,并从路由中提取参数以在下拉列表中设置所选选项。这一切都是在ngOnInit()中完成的。因为这两个选项都使用可观察值,所以我的解决方案是否会有一个竞争条件,在填充选项之前可以设置下拉选择值

从'@angular/core'导入{Component,OnInit};
从'@angular/forms'导入{AbstractControl,FormBuilder,FormGroup,NgForm};
从'@angular/router'导入{ActivatedRoute};
从“ngx-toastr”导入{ToastrService};
从“../../shared/services/project.service”导入{ProjectService};
@组成部分({
选择器:“应用程序项目状态表”,
templateUrl:“./project status form.component.html”,
样式URL:['./项目状态表单.component.scss']
})
导出类ProjectStatusFormComponent实现OnInit{
projectShortName:string;
projectsShortName:字符串[];
projectStatusForm:FormGroup;
建造师(
私人fb:FormBuilder,
私人项目服务:项目服务,
专用路由:激活的路由,
私人toastr:ToastrService
) {
this.projectStatusForm=this.fb.group({
projectShortName:“”,
状态文本:“”,
原始差异:“”
});
}
ngOnInit():void{
//填充下拉列表。
this.projectService.getProjectsShortName().subscribe((数据)=>this.projectsShortName=data);
//设置下拉列表的选定值。
this.route.params.subscribe(params=>{
this.projectShortName=params['projectShortName'];
const projectShortName下拉框:AbstractControl=this.projectStatusForm.get('projectShortName');
if(this.projectShortName){
projectShortName下拉框.setValue(this.projectShortName);
projectShortNameDropdownBox.disable();
}否则{
projectShortNameDropdownBox.enable();
}
});
}
}

项目
{{shortName}}
状态文本
方差

这可能是一种竞争条件。通常,从API中提取数据要比从路由器中提取数据花费更多的时间,但我仍然希望使用mergeMap来避免竞争条件错误。您可以在下面的链接中查看合并地图代码示例:


没有显式同步的多个异步操作始终是竞争条件。在这种情况下,竞争条件的可能性很低——因为一个操作涉及IO,而另一个操作不涉及IO——但您的实现无法保证顺序


您可以使用显式同步。此外,如果您的组件不是A,请考虑使用A替代;它是同步的。

我最终使用了switchMap而不是mergeMap,因此如果
getProjectsShortName()
多次返回,它将自动取消订阅。
//emit 'Hello'
const source = Rx.Observable.of('Hello');
//map to inner observable and flatten
const example = source.mergeMap(val => Rx.Observable.of(`${val} World!`));
//output: 'Hello World!'
const subscribe = example.subscribe(val => console.log(val));