Перебирать файл CSV и запускать ожидание для каждой строки? - PullRequest
0 голосов
/ 30 января 2020

Я хочу перебрать CSV-файл в узле, и для каждой строки вызвать асинхронную функцию и дождаться ее завершения.

Как я могу это сделать?

У меня есть:

const getFile = async function(url) {
    const response = await page.goto(url, { waitUntil: 'networkidle2' });
    await page.waitFor(3000);
    const ad = await page.waitForSelector('div.chart');
    await ad.screenshot({
        path: path
    });
};

fs.createReadStream(fname)
    .pipe(csv())
    .on('data', (row) => {
        let id = row.ad_id;
        let url = 'xxxx' + id;
        await getFile(path);
    }).on('end', () => {
        console.log('CSV file successfully processed');
    });

Но это дает мне SyntaxError: await is only valid in async function, выбрасывая ошибку в строке await getFile(path);.

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Поскольку функция getFile уже является обещанием, вы можете приостановить и возобновить конвейер, используя функции обещания и не делая функцию асинхронной c.

const csvPipe = fs.createReadStream(fname).pipe(csv());
csvPipe.on('data', (row) => {
    csvPipe.pause();
    let id = row.ad_id;
    let url = 'xxxx' + id;
    getFile(path).finally(() => csvPipe.resume());
}).on('end', () => {
    console.log('CSV file successfully processed');
});
0 голосов
/ 30 января 2020

Вы получаете SyntaxError, потому что, как говорится, await допустимо только в функции async. Вы можете исправить это, сделав обратный вызов async, но это само по себе не приведет к тому, что канал прекратит излучать дальнейшие события data, пока не завершится функция asyn c. Однако вы, вероятно, можете сделать это вручную так:

const csvPipe = fs.createReadStream(fname).pipe(csv());
csvPipe.on('data', async (row) => {
        csvPipe.pause();
        let id = row.ad_id;
        let url = 'xxxx' + id;
        await getFile(path);
        csvPipe.resume();
    }).on('end', () => {
        console.log('CSV file successfully processed');
    });
...