Angular 在for循环中等待多个观测值的结果

Angular 在for循环中等待多个观测值的结果,angular,typescript,rxjs,observable,angular8,Angular,Typescript,Rxjs,Observable,Angular8,我有一个问题,我找不到解决方案,因为我不太了解RxJs 我创建了一个文件输入,用户必须选择一个XLSX文件和一个电子表格才能将数据导入数据库。 当用户验证其文件时,在插入之前会对文档进行多次检查,以避免出现任何问题 文件被逐行扫描和检查。但我的一个验证是个问题。 我必须使用数据库过程来检查数据库中是否存在数据。 问题是我的查询返回一个观察者, 因此,我的for循环甚至在收到请求的结果之前就遍历了我的整个文件。控制台在检查前显示“导入完成” 我想知道是否可以在继续循环之前等待subscibe的结果

我有一个问题,我找不到解决方案,因为我不太了解RxJs

我创建了一个文件输入,用户必须选择一个XLSX文件和一个电子表格才能将数据导入数据库。 当用户验证其文件时,在插入之前会对文档进行多次检查,以避免出现任何问题

文件被逐行扫描和检查。但我的一个验证是个问题。 我必须使用数据库过程来检查数据库中是否存在数据。 问题是我的查询返回一个观察者, 因此,我的for循环甚至在收到请求的结果之前就遍历了我的整个文件。控制台在检查前显示“导入完成”

我想知道是否可以在继续循环之前等待subscibe的结果,或者完成循环,一旦获得所有结果,就完成导入

组成部分:

商店钱包:

服务钱包:

谢谢你的帮助,我的英语也很抱歉。

你可以使用Observable.forkJoin,在这里你可以对Observable进行循环。这就是他的目的

forkJoin允许您等待所有可观察对象收到数据

我不确定您的HTTP调用返回的是什么,因此这里有一个简单的示例:

    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();
    }
}