Angular 在for循环中等待多个观测值的结果
我有一个问题,我找不到解决方案,因为我不太了解RxJs 我创建了一个文件输入,用户必须选择一个XLSX文件和一个电子表格才能将数据导入数据库。 当用户验证其文件时,在插入之前会对文档进行多次检查,以避免出现任何问题 文件被逐行扫描和检查。但我的一个验证是个问题。 我必须使用数据库过程来检查数据库中是否存在数据。 问题是我的查询返回一个观察者, 因此,我的for循环甚至在收到请求的结果之前就遍历了我的整个文件。控制台在检查前显示“导入完成” 我想知道是否可以在继续循环之前等待subscibe的结果,或者完成循环,一旦获得所有结果,就完成导入 组成部分: 商店钱包: 服务钱包: 谢谢你的帮助,我的英语也很抱歉。你可以使用Observable.forkJoin,在这里你可以对Observable进行循环。这就是他的目的 forkJoin允许您等待所有可观察对象收到数据 我不确定您的HTTP调用返回的是什么,因此这里有一个简单的示例:Angular 在for循环中等待多个观测值的结果,angular,typescript,rxjs,observable,angular8,Angular,Typescript,Rxjs,Observable,Angular8,我有一个问题,我找不到解决方案,因为我不太了解RxJs 我创建了一个文件输入,用户必须选择一个XLSX文件和一个电子表格才能将数据导入数据库。 当用户验证其文件时,在插入之前会对文档进行多次检查,以避免出现任何问题 文件被逐行扫描和检查。但我的一个验证是个问题。 我必须使用数据库过程来检查数据库中是否存在数据。 问题是我的查询返回一个观察者, 因此,我的for循环甚至在收到请求的结果之前就遍历了我的整个文件。控制台在检查前显示“导入完成” 我想知道是否可以在继续循环之前等待subscibe的结果
loadedCharacter: {};
constructor(private http: HttpClient) { }
ngOnInit() {
let character = this.http.get('https://swapi.co/api/people/1');
let characterHomeworld = this.http.get('http://swapi.co/api/planets/1');
forkJoin([character, characterHomeworld]).subscribe(results => {
// results[0] is our character
// results[1] is our character homeworld
results[0].homeworld = results[1];
this.loadedCharacter = results[0];
});
我的解决方案:
checkWallets(xlsx: XLSXObjective, lineError): Observable<any> {
const obs = this.walletService.checkWallets(xlsx).pipe(share());
obs.subscribe(wallets => { ... });
return obs;
}
checkWallets(xlsx: XLSXObjective): Observable<any> {
var customError: string = 'ERREUR';
return this.http.put<Wallet[]>('/api/wallet/CheckWallets', xlsx)
.pipe(catchError(this.error.handleError<any>(customError)));
}
loadedCharacter: {};
constructor(private http: HttpClient) { }
ngOnInit() {
let character = this.http.get('https://swapi.co/api/people/1');
let characterHomeworld = this.http.get('http://swapi.co/api/planets/1');
forkJoin([character, characterHomeworld]).subscribe(results => {
// results[0] is our character
// results[1] is our character homeworld
results[0].homeworld = results[1];
this.loadedCharacter = results[0];
});
private observables$ = [];
importObjectives(): void {
if (this.file) {
if (["xlsx","xls","csv"].includes(this.file.name.split('.').pop())) {
if (typeof (FileReader) !== 'undefined') {
const reader = new FileReader();
reader.onload = (e: any) => {
let u8 = new Uint8Array(e.target.result);
let wb: XLSX.WorkBook = XLSX.read(u8, { type: 'array' });
let wsname: string = wb.SheetNames[0];
let ws: XLSX.WorkSheet = wb.Sheets[wsname];
let xlsData = XLSX.utils.sheet_to_json(ws, { header: 1 });
xlsData.shift();
for(var row of xlsData) {
var lineError = xlsData.indexOf(row) + 2;
// Other checks...
this.observables$.push(this.storeWallets.checkWallets(this.XLSXObjective, lineError))
}
forkJoin(this.observables$).subscribe(results => {
if(this.errors.length > 0) {
console.error("Errors:");
console.error(this.errors);
} else {
console.log("Import finish");
}
}
this.dialogRef.close();
};
reader.readAsArrayBuffer(this.file);
}
} else {
console.error("Incompatible file");
this.dialogRef.close();
}
} else {
console.error("No file");
this.dialogRef.close();
}
}