代码之家  ›  专栏  ›  技术社区  ›  m9m9m

如何确保函数返回前所有行都已执行

  •  0
  • m9m9m  · 技术社区  · 6 年前

    从index.js调用readcsv

    const productIds = await readCSV();
    

    在另一个文件中:

    async function readCSV() {
            const filepath = path.resolve('src/input_csv.csv');
            const readstream = await fs.createReadStream(filepath);
            const stream = await readstream.pipe(parser());
            let productIds = [];
            await stream.on('data', data => {
                productIds.push(data.SourceProductId);
                console.log('SourceProductId', data.SourceProductId);
            });
            await stream.on('end', () => {
                console.log(productIds);
            });
            if (productIds.length > 0) return productIds;
            else return 'no products found';
        });
    }
    

    它给出了输出:

    in main: []
    SourceProductId 1000050429
    SourceProductId 1132353
    SourceProductId 999915195
    SourceProductId 50162873
    SourceProductId 1000661087
    [ '1000050429', '1132353', '999915195', '50162873', '1000661087' ]
    

    我希望函数返回从csv读取的所有值的数组。但似乎在执行 stream.on 语句。如何在返回前确保所有行都已执行。我把等待放在每句话之前,但没有运气。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Patrick Hund    6 年前

    stream.on 不兑现承诺,所以你不能 await 它。

    你可以通过归还你的承诺来解决这个问题。 readCSV 功能:

    function readCSV() {
        return new Promise(resolve => {
            const filepath = path.resolve('src/input_csv.csv');
            const readstream = fs.createReadStream(filepath);
            const stream = readstream.pipe(parser());
            let productIds = [];
            stream.on('data', data => {
                productIds.push(data.SourceProductId);
                console.log('SourceProductId', data.SourceProductId);
            });
            stream.on('end', () => {
                console.log(productIds);
                if (productIds.length > 0) resolve(productIds);
                else resolve('no products found');
            });
    
        });
    }
    

    通过将回调函数作为参数传递来创建承诺。那个回调函数得到一个参数 resolve ,这是在异步操作完成时调用的另一个回调函数,传递结果。

    在上面的例子中,我们称之为 决定 文件读取流完成后使用产品ID回调。

    自从 雷德克斯夫 现在兑现承诺,你可以 等待 就像在代码示例中那样:

    const productIds = await readCSV();