typescript 为什么我的async/await实现没有工作?

gijlo24d  于 2023-01-31  发布在  TypeScript
关注(0)|答案(1)|浏览(223)

我有一个csv文件列表,想解析它们。为此我导入了fast-csv。我尝试实现另一个stack overflow thread中描述的功能。
但是在我的代码中它不起作用,我真的很困惑为什么它不起作用。我总是得到一个空数组作为log(data)的输出。

import { ParserOptionsArgs, parseFile } from '@fast-csv/parse'
import fs from 'fs'
import path from 'path'

var files: string[] = []
fs.readdirSync(inArg).forEach((file) => {
  files.push(path.parse(file).name)
})

files.forEach( async(file) => {
    const data: any = await readCsv(`${inArg}/${file}.csv`, { headers: true }, (row) => {})
    log(data)
    // here I want make some useful with the data
})

function readCsv(path: string, options: ParserOptionsArgs | undefined, rowProcessor: (arg0: any) => any) {
  return new Promise((resolve) => {
    const data: any = []

    parseFile(path, options)
      .on('data', (row: any) => {
        const obj = rowProcessor(row)
        if (obj) {
          data.push(obj)
          log(obj)
        }
      })
      .on('end', () => {
        resolve(data)
        log('Done')
      })
  })
}

控制台输出:

Files: [ 'test1', 'test2', 'test3', 'test4' ]
Done
[]
Done
[]
Done
[]
Done
[]

有人能帮我吗?

rseugnpd

rseugnpd1#

您的async/await代码没有问题。**但是:**您正在传递一个rowProcessor函数,该函数的

(row) => {}

readCsv。这个rowProcessor不返回任何东西。我知道这是一个微妙的陷阱,我不止一次偶然发现这个问题。但是上面是这样写的,{}没有定义一个对象,而是一个空函数体。如果你真的想返回一个空对象,你的rowProcessor应该

(row) => { return {}; }

(row) => ({})

现在,由于行处理器不返回任何内容,在下面的代码段中

const obj = rowProcessor(row)
if (obj) {
  data.push(obj)
  log(obj)
}

obj当然将始终为undefined,因此,没有任何内容被推送到data数组,因此log(data)将记录空数组,我们看到。

相关问题