0

下面的 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 解决方案,但没有运气。在这个承诺中创建更多承诺对我来说似乎有点草率和混乱,但我也没有成功。

4

1 回答 1

0

使用async/await和你不喜欢的嵌套承诺,你可以将你的代码简化为这样的东西,它应该总是等待所有的结果。我假设您的问题是fromFile方法,感觉它本身就是异步的,因为它使用了then您不等待的 a 。

async function matchReport(shop, arr) {
    
    const matches = await Promise.all(arr.map(async filename => {
       
        const reportData = await csv().fromFile( filename );

        if( reportData[0]['Work'].match(shop.productRegex) ){
        
            return filename;
            
        }
        
    }));
    
    return {
        'shop': shop.name,
        'reports': matches.filter( Boolean )
    };
    
}

于 2020-12-03T21:05:45.503 回答