微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

函数不等待 Firebase 写入完成

如何解决函数不等待 Firebase 写入完成

背景

我正在编写一个 Angular 组件,它允许用户上传多个读取的 excel 文件,然后将内容写入 Firestore 数据库。 该组件适用于具有多个工作表的多个工作簿。当用户上传文件时,用户会得到两个选项:

-- 1 分析文件(给出和估计导入所有文件的时间)或

-- 2 立即导入。

如果用户选择先分析文件,则返回一个数组 listofWorkbookData显示页面上。如需参考,请参阅listofWorkbookData

的声明

来自 data-import.component

listofWorkbookData: workbookData[] = [];

来自 data-importer.service

export interface workbookData {
  name: string;
  size: number;
  file: excelhandler.WorkBook;
}

现在在显示分析后,用户可以选择现在导入 - 如果他们单击该选项,则会在组件中调用以下 importFiles 函数

来自 data-import.component

  async importFiles(): Promise<void> {
    // Change states at start
    this.optionSelected = true;
    this.importStarted = true;  

    /*If analysis has been prevIoUsly been done,we can move straight 
    to importing,alternatively we first need to get the workbooks 
    then start the import process */
    if (this.analysisComplete) {
      for (
        // Go through each workbook
        var fileNum = 0;
        fileNum < this.eventValue.target.files.length;
        fileNum++
      ) {
        for (
          // Go through each sheet in workbook
          var sheetNum = 0;
          sheetNum < this.listofWorkbookData[fileNum].file.SheetNames.length;
          sheetNum++
        ) {
          console.log(
            'Importing file ' +
              this.listofWorkbookData[fileNum].name +
              ' sheet ' +
              this.listofWorkbookData[fileNum].file.SheetNames[sheetNum] +
              ' - Sheet ' +
              (sheetNum + 1) +
              ' of ' +
              this.listofWorkbookData[fileNum].file.SheetNames.length
          );
          await this.dataService.importWorksheet(this.listofWorkbookData[fileNum].file,sheetNum)
          /* For Now we will assume that all results in a single worksheet are in the same league and the league code
          will be in a column with the header name 'Div' and that the first result WILL have that object
          */
          console.log("Inside importFiles")
        }
      }
    } // Process to direct import to be completed later

    // Change states at completion
    this.importComplete = true;
    this.importStarted = false;
  }

如您所见,该函数遍历每个工作簿,并在每个工作簿中遍历每个工作表,并将该特定工作表发送到服务 importWorksheet 中名为 data-importer.service函数。理论上,调用应该等待函数完成后再继续。该服务功能如下:

来自 data-importer.service

  async importWorksheet(workbook: excelhandler.WorkBook,sheetNum: number): Promise<void> {
      const worksheet = this.getWorkSheet(workbook,sheetNum);
      const matrix = this.covertWorksheetToMatrix(worksheet);
      const listofResults = this.getlistofResults(matrix);
      if (listofResults.length > 0) {
        const importObject = this.generateObjectForImport(listofResults);
        await this.putImportObject(importObject);
        console.log("Inside importWorksheet")
      }
  }

我使这个函数与 promise 的返回异步,因为函数可以等待 putImportObject函数返回之前完成。同一服务中的 putImportObject 如下:

  putImportObject(importObject: importObject) {
    return new Promise<void>((resolve,reject) => {
      this.firestore
        .collection('Results')
        .add(importObject)
        .then(
          (res) => {
            console.log('Record sucessfully written');
          },(err) => {
            reject(err);
            console.log('Record not written');
          }
        );
      resolve();
    });
  }

问题

我试图一次只处理和导入一张工作表,但它没有这样做。所有工作表都被批量处理,然后它们处理的所有对象都被批量导入 - 根据以下控制台屏幕截图:

enter image description here

文件批处理没问题,但当我尝试大批量(文件数量或大小)时,我要么遇到 Firestore 配额或内存问题,如下所示:

Quota error

Memory error

请有人指导我如何修改它可以运行和打算的代码 - 在开始下一个工作表之前,一次处理和导入/编写一个工作表,而不是像它似乎正在做的那样。

如果有帮助,我们会很感激的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。