簡體   English   中英

如何使用 csv-parse 避免等待...

[英]How to avoid for await...of with csv-parse

我希望在這個問題上接受教育,因為我花了幾天時間試圖自己解決它,但無濟於事。

我正在使用csv-parse來解析 CSV 文件。
我使用ESLint作為我的 Linter
我正在使用 ESLint 的Airbnb JavaScript Style Guide插件
我正在使用 NodeJS 在后端運行它

我的 function 是:

const { parse } = require('csv-parse');
const fs = require('fs');
const csvFile = 'myCsvFile.csv';

async function parseCsv(csvFile) {
  const records = [];
  const parser = fs.createReadStream(csvFile).pipe(parse({ delimiter: ',', columns: true }));
  for await (const record of parser) {
    records.push(record);
  }
  return records;

function 運行良好,但是我試圖遵守 Airbnb 的樣式指南,它不喜歡for await...of循環,因為它違反了no-restricted-syntax違規行為。

我很好奇是否有更好的方法來寫這篇文章以符合 Airbnb 的風格指南,或者,如果這是可以忽略違規的情況之一?

風格指南說:

11.2 暫時不要使用生成器。 為什么? 它們不能很好地轉換為 ES5。

幸運的是,如果您使用的是最新的 NodeJS 版本,則無需向下轉換,並且可以使用引擎的原生支持。 對於瀏覽器,這個建議也很快就過時了。

使用事件結束返回 promise 怎么樣?

async function parseCsv(csvFile) {
  return new Promise((resolve) => {
    const records = [];
    const stream = fs.createReadStream(csvFile);
    const parser = stream.pipe(parse({ delimiter: ',', columns: true }));
    
    parser.on('readable', () => {
      while (record = parser.read()) {
        records.push(record);
      }
    });

    let ended = false;

    parser.on('error', (error) => {
      console.error(error.message);
      if (!ended) {
        ended = true;
        resolve(records);
      }
    });

    parser.on('end', () => {
      if (!ended) {
        ended = true;
        resolve(records);
      }
    });
  });
}

根據答案中給出的建議,我將忽略Airbnb 樣式指南並使用異步迭代器方法。

最終代碼:

const { parse } = require('csv-parse');
const fs = require('fs');
const path = require('path');
const debug = require('debug')('app:csv:service');
const chalk = require('chalk');

async function parseCsv(csvFile) {
  try {
    const records = [];
    const stream = fs.createReadStream(csvFile);
    const parser = stream.pipe(parse({ delimiter: ',', columns: true }));
    // eslint-disable-next-line no-restricted-syntax
    for await (const record of parser) {
      records.push(record);
    }
    return records;
  } catch (error) {
    debug(`${chalk.red('Failed')} to parse CSV`);
    debug(`${chalk.red('ERROR:')} ${error}`);
    throw error;
  }
}

可能是時候尋找一個新的風格指南來遵循了。 感謝num8er的代碼建議(我采納了您的一個想法,使我的代碼更具可讀性)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM