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

标签 javascript promise async-await papaparse

有人可以帮助我理解为什么这会返回待处理的 promise ,而不是数据吗?

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),它会按预期将数据数组记录到控制台。为什么它不简单地返回该数组?!?!

最佳答案

正如 Roamer-1888 在评论中添加的那样,async functions总是返回 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() 时,如果您位于异步函数或链 .then() 内部,则可以使用 await > 在返回的 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 (感谢在 error 函数中调用 reject)。请记住,通过使用 results.data 调用 resolve,您可以将 results.errorsresults.meta 放在一边。包含有关读取的 csv 的有用信息。

关于javascript - 如何通过 Promise/async-await 返回 Papa 解析的 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56427009/

相关文章:

angular - 拒绝 Angular 2 中的 Promise 时未处理的 Promise 拒绝

当我将 promise 分配给线程时,C++ 获取 "Debug Error R6010 -abort() has been called "

c# - 异步等待调用不返回

c# - 异步处理从数据库引擎返回的实体

javascript - jquery源错误

javascript - 我如何打印用户在javascript中点击的字母?

javascript - Axios - [未处理的 promise 拒绝 : Error: Request failed with status code 404]

javascript - 正确销毁 dojo DataStore

javascript - 向 Promise.all() 添加一个 Promise

c# - 我使用 IO 的所有操作都应该是异步的吗?