为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨__羊羊 2021-06-17 14:01:09
有人能帮我理解为什么这会返回一个挂起的承诺,而不是数据吗?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),它会按预期将数据数组记录到控制台。为什么它不简单地返回那个数组?!?!
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

正如 Roamer-1888 在评论中添加的那样,异步函数总是返回一个Promise,即使你await在它里面然后返回数据,它也会作为一个 Promise 返回。


在函数的调用者中,您必须等待 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异步函数或.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 的有用信息。


查看完整回答
反对 回复 2021-06-18
  • 1 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信