有人能帮我理解为什么这会返回一个未决的承诺,而不是数据吗?
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),它会按照预期将数据数组记录到控制台。为什么它不简单地返回该数组?!?!
发布于 2019-06-03 20:19:04
正如Roamer-1888在注释中添加的那样,async functions总是返回一个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,也可以在返回的Promise上使用chain .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,可以将包含有关已读取csv的有用信息的results.errors和results.meta放在一边。
https://stackoverflow.com/questions/56427009
复制相似问题