Как вернуть проанализированный папой CSV с помощью обещания / асинхронного ожидания - PullRequest
0 голосов
/ 03 июня 2019

Может кто-нибудь помочь мне понять, почему это возвращает ожидающее обещание, а не данные?

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 Ответ

2 голосов
/ 03 июня 2019

Как добавил Roamer-1888 в комментариях, асинхронные функции всегда возвращают Promise , даже если вы await внутри него и затем возвращаете данные, которые он вернет в качестве Promise.

В вызывающей функции функции вам придется ждать Promise или использовать .then() для доступа к доставленным данным.

Функция toJson может быть лучше записана впросто верните обещание, подобное этому

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() в возвращенном обещании, чтобы получить доступ кdata.

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.

...