有人可以帮助我理解为什么它返回未完成的承诺而不是数据吗?
rootArray[1][2].push('new content')
如果我将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
,则会按预期将数据数组记录到控制台。为什么不简单地返回该数组?!?!
答案 0 :(得分:2)
正如Roamer-1888在注释中所添加的那样,async functions始终返回Promise,即使您在其中await
然后返回数据也将作为一个承诺来返回。
在函数的调用方中,您将必须等待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
或返回的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中捕获错误(由于在reject
函数中调用了error
)。请记住,通过用resolve
调用results.data
,您将results.errors
和results.meta
放在一边,其中包含有关读取的csv的有用信息。