如何通过 promise/async-await return Papa 解析 CSV
How to return Papa-parsed CSV via promise/async-await
谁能帮我理解为什么这个 return 是待定的承诺,而不是数据?
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)
,它会按预期将数据数组记录到控制台。为什么不直接 return 那个数组?!?!
正如 Roamer-1888 在评论中添加的那样,async functions always return a Promise,即使您在其中 await
然后 return 数据,它也会 return 作为 Promise。
在函数的调用者中,您必须等待 Promise 或对其使用 .then()
才能访问传递的数据。
toJson
函数最好只写成 return 像这样的 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
或 returned 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 中捕获错误(感谢在 error
函数中调用 reject
)。请记住,通过使用 results.data
调用 resolve
,您将 results.errors
和 results.meta
放在一边,其中包含有关读取 csv 的有用信息。
谁能帮我理解为什么这个 return 是待定的承诺,而不是数据?
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)
,它会按预期将数据数组记录到控制台。为什么不直接 return 那个数组?!?!
正如 Roamer-1888 在评论中添加的那样,async functions always return a Promise,即使您在其中 await
然后 return 数据,它也会 return 作为 Promise。
在函数的调用者中,您必须等待 Promise 或对其使用 .then()
才能访问传递的数据。
toJson
函数最好只写成 return 像这样的 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
或 returned 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 中捕获错误(感谢在 error
函数中调用 reject
)。请记住,通过使用 results.data
调用 resolve
,您将 results.errors
和 results.meta
放在一边,其中包含有关读取 csv 的有用信息。