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

有人能帮我理解为什么这会返回一个挂起的承诺,而不是数据吗?


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行更改为console.log(result.data),它会按预期将数据数组记录到控制台。为什么它不简单地返回那个数组?!?!


杨__羊羊
浏览 139回答 1
1回答

翻过高山走不出你

正如 Roamer-1888 在评论中添加的那样,异步函数总是返回一个Promise,即使你await在它里面然后返回数据,它也会作为一个 Promise 返回。在函数的调用者中,您必须等待 Promise 或使用.then()它才能访问传递的数据。该toJson函数可以更好地编写为仅返回这样的 Promisefunction 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异步函数或.then()返回的 Promise链来访问数据。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.errors并results.meta包含有关读取 csv 的有用信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript