如何通过promise / async-await返回Papa解析的CSV

时间:2019-06-03 12:03:59

标签: javascript promise async-await papaparse

有人可以帮助我理解为什么它返回未完成的承诺而不是数据吗?

rootArray[1][2].push('new content')

如果我将async function toJson (filepath) { const file = fs.createReadStream(filepath) let json = new Promise((resolve, reject) => { Papa.parse(file, { header: true, complete (results, file) { resolve(results) }, error (err, file) { reject(err) } }) }) let result = await json return result.data } 行更改为return result.data,则会按预期将数据数组记录到控制台。为什么不简单地返回该数组?!?!

1 个答案:

答案 0 :(得分:2)

正如Roamer-1888在注释中所添加的那样,async functions始终返回Promise,即使您在其中await然后返回数据也将作为一个承诺来返回。

在函数的调用方中,您将必须等待Promise或在其上使用.then()才能访问所传递的数据。

最好将toJson函数编写为只返回这样的Promise

function toJson (filepath) {
  const file = fs.createReadStream(filepath)
  return new Promise((resolve, reject) => {
    Papa.parse(file, {
      header: true,
      complete (results, file) {
        resolve(results.data)
      },
      error (err, file) {
        reject(err)
      }
    })
  })
}

现在,当您调用toJson()时,如果您位于异步函数中,则可以使用await或返回的Promise上的链.then()来访问数据。

async function main() {
  try {
    const data = await toJson(filepath)
    // do something with the data...
  } catch (err) {
    console.error('Could not parse json', err)
  }
}

或与.then()

toJson('path')
.then(console.log)
.catch(console.log)

您将能够从底层FileReader中捕获错误(由于在reject函数中调用了error)。请记住,通过用resolve调用results.data,您将results.errorsresults.meta放在一边,其中包含有关读取的csv的有用信息。