如何解决函数不等待 Firebase 写入完成
背景
我正在编写一个 Angular 组件,它允许用户上传多个读取的 excel 文件,然后将内容写入 Firestore 数据库。 该组件适用于具有多个工作表的多个工作簿。当用户上传文件时,用户会得到两个选项:
-- 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();
});
}
问题
我试图一次只处理和导入一张工作表,但它没有这样做。所有工作表都被批量处理,然后它们处理的所有对象都被批量导入 - 根据以下控制台屏幕截图:
小文件批处理没问题,但当我尝试大批量(文件数量或大小)时,我要么遇到 Firestore 配额或内存问题,如下所示:
请有人指导我如何修改它可以运行和打算的代码 - 在开始下一个工作表之前,一次处理和导入/编写一个工作表,而不是像它似乎正在做的那样。
如果有帮助,我们会很感激的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。