为空,而函数内的结果不是"/>
解析TS中的Zip文件。尽管等待,返回的结果显示为空,而函数内的结果不是
我正在编写一些代码来解析存储在Zip文件夹中的所有CSV文件。我为此使用JSZip。我遍历dataset
的所有文件,并将每个文件转换为entry
。我将结果串联在名为entries
的数组中。
这是entries
数组在以下情况下发生的事情:
- 我从循环内将其记录到控制台-正确打印文件。
- 我从循环外部的同一函数将其记录到控制台,而没有setTimeout-打印空数组
- 我使用setTimeout在循环外从同一功能将其记录到控制台-正确打印文件。
现在我从此函数返回entries
,我尝试从以下位置返回它:
setTimeout-返回未定义
setTimeout右边-返回空数组
这里是代码:
private async parseAllFiles (dataset: JSZip, id: string): Promise<string[]> {
let entries: string[] = [];
await dataset.forEach( async (fileName) => {
const fileContent = await dataset.file(fileName).async("text"); // async func provided by JSZip
const parsedEntries = await this.parseCsv(fileContent, courseCode); // another async function
});
console.log('Entries are: \n');
console.log(entries); // Prints empty array
setTimeout( () => {
console.log("Entries are: ");
console.log(entries); // prints perfectly
return Promise.resolve(entries); // returns undefined
}, 1500);
// return Promise.resolve(entries); // returns empty array
}
我很确定entries
返回得太早了,但是如何解决这个问题,最好不要使用手动setTimeout吗?
forEach
是一个无效的返回函数,因此无法等待。
您可以做的是创建一个承诺数组:
const promises: Promise[] = [];
然后添加到forEach
中的数组:
dataset.forEach(fileName => {
promises.push(async () => {
const fileContent = await dataset.file(fileName).async("text");
const parsedEntries = await this.parseCsv(fileContent, courseCode);
return parsedEntries;
});
});
然后等待他们全部完成:
const entries: string[] = (await Promise.all(promises)).flat();
[Promise.all
返回一个新的Promise
,它解析为提供的Promise
结果的数组。
这些可以使用Array.flat()
展平为单个数组。
更多推荐
解析TS中的Zip文件。尽管等待,返回的结果显示为空,而函数内的结果不是
发布评论