Как убедиться, что все строки выполнены перед возвратом функции - PullRequest
0 голосов
/ 20 ноября 2018

Вызов readCSV из index.js

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 Ответ

0 голосов
/ 20 ноября 2018

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, который является другой функцией обратного вызова, которую вы вызываете, когда ваша асинхронная операция выполнена, передавая результат.

В приведенном выше примере мы вызываем этот обратный вызов resolve сидентификаторы продукта после завершения потока чтения файла.

Поскольку readCSV теперь возвращает обещание, вы можете await выполнить его, как в примере с кодом:

const productIds = await readCSV();
...