下面的 Node.js 函数采用:
- 一个
shop
包含正则表达式的对象 - 文件名数组
该函数将读取数组中列出的每个 csv 文件,并使用正则表达式测试第一行中的一个单元格,返回一个新的匹配文件名数组。
function matchReport(shop, arr) {
return promise = new Promise(resolve => {
var newArray = [];
for(var j=0;j<arr.length;++j) {
let filename = arr[j];
csv()
.fromFile(filename)
.then(reportData => {
if (reportData[0]['Work'].match(shop.productRegex)) {
newArray.push(filename);
}
if (j === arr.length) {
resolve(newArray);
}
});
}
}).then(matches => {
return {
'shop' : shop.name,
'reports' : matches
}
}).catch(e => {
console.log(e);
});
}
该函数很少会以正确的行为返回,即:
{ shop: 'shop1',
reports: [ '../artist-sales-report-2020-11-12(1).csv' ] }
{ shop: 'shop2',
reports:
[ '../artist-sales-report-2020-12-03.csv',
'../artist-sales-report-2020-09-01.csv' ] }
更常见的是,它返回时缺少报告,如下所示:
{ shop: 'shop1',
reports: [ '../artist-sales-report-2020-11-12(1).csv' ] }
{ shop: 'shop2',
reports: [ '../artist-sales-report-2020-12-03.csv' ] }
我了解问题发生在 csvreportData
块内的位置。我知道这是一个异步问题,我尝试编写更详细的 if..then 或 switch 语句作为 hack 解决方案,但没有运气。在这个承诺中创建更多承诺对我来说似乎有点草率和混乱,但我也没有成功。