我正在用Angular2開發一個Web應用程序,並且從服務器獲取數據時遇到了一些問題。如何在Angular 2中「鏈接」兩個獨立的可觀察對象
import ...
@Component({
...
})
export class EmployeeManagementTableComponent implements OnInit, OnDestroy{
private employees: Employee[];
private departments: SelectItem[] = [];
private selectedDepartment: string;
private columns: any[];
private paramSub: any;
private employeesSub: any;
private departmentSub: any;
constructor(private employeeManagementService: EmployeeManagementService,
private route: ActivatedRoute,
private router: Router,
private ccs: ComponentCommunicatorService,
private logger: Logger) { }
ngOnInit(){
this.columns = [
...
];
//ccs is just a service for storing/getting app wide infomation
this.selectedDepartment = this.ccs.getSelectedDepartment();
this.getDepartments();
this.getEmployees(this.selectedDepartment);
...
}
ngOnDestroy(){
/*this.employeesSub.unsubscribe();
this.departmentDub.unsubscribe();*/
}
getDepartments(){
this.departments.push({label: 'Alle', value: 'all'});
this.departmentSub = this.employeeManagementService.getDepartments().subscribe(
data => {data.forEach((item, index) => {
this.departments.push({label: item, value: index.toString()});
});
},
err => this.logger.error(err),
() => {this.logger.log('done loading');
this.departmentSub.unsubscribe()}
);
}
getEmployees(department: any){
this.employeesSub = this.employeeManagementService.getEmployees(department).subscribe(
data => {this.employees = data},
err => this.logger.error(err),
() => {this.logger.log('done loading');
this.employeesSub.unsubscribe()}
);
}
正如你看到組件初始化時它調用兩個獲取數據的方法。這些方法從我的服務中獲得可觀察的並訂閱它們。
問題是,訂單就像call1, call2, result1, result2, ...
,我認爲有不對的地方。應該是call1, result1, call2, result2, ...
還是我錯了?我試着在observable1的onComplete
中訂閱observable2,但我認爲專用方法當時是無用的。 我已經研究並找到了一些解決方案,同時用concat同時訂閱兩個observables,但是我只希望getDepartments()在所有數據流量完成時繼續執行代碼。
而且我應該取消訂閱OnDestroy()
或OnComplete
的subscribe
函數,我真的沒有什麼區別嗎?
正如我理解'forkJoin',它會給我我的員工和部門在一個可觀察的。但我希望我的兩種方法保持獨立。這也是可能的嗎?地圖也是我不明白的事情。什麼是'flatMap'在做什麼?我試圖查找它,但我仍然沒有得到'地圖'的目的。 – moessi774
它們將並行執行,但是在同一個異步數據流中執行。您可以將您的處理實現爲兩種不同的方法。唯一的限制是它們同時返回一個可觀察對象... –
map和flatMap之間的不同之處在於,第一個返回原始對象,而第二個可以參與數據流的可觀察對象。這個視頻可以幫助你理解和看到不同的行動:https://egghead.io/lessons/rxjs-rxjs-map-vs-flatmap ;-) –