调用async函数GetInfo返回Promise { pending }如何获取records数组?
问题原因
- 所有标记了
async的函数,无论内部返回什么类型的值,调用后永远会返回一个Promise对象。你直接在最外层同步执行console.log(GetInfo())时,JS主线程不会等待内部的文件读取、CSV解析这类异步IO操作执行完成,此时拿到的自然是还未进入落定状态的Promise { <pending> }。 - 取消
GetInfo内部注释的console.info(records)能看到结果,只是时序上的巧合:外层打印pending状态的Promise后,内部的异步操作刚好在极短的IO等待时间内执行完成,触发了函数内部的打印语句,并不是代码逻辑本身正确拿到了返回值。
修复方案
你的CSV读取、解析逻辑本身没有问题,只需要在最外层调用GetInfo时,等待Promise状态变为resolved后再获取返回值即可,三种常用写法如下:
- 方案1:使用顶层await(Node.js 14.8+ 版本支持)
// 直接替换原代码最后一行的console.log即可 const records = await GetInfo() console.log(records)
- 方案2:用异步立即执行函数包裹调用逻辑(兼容所有支持async/await的Node版本)
// 直接替换原代码最后一行的console.log即可 (async () => { const records = await GetInfo() console.log(records) })()
- 方案3:使用Promise原生then方法获取结果
// 直接替换原代码最后一行的console.log即可 GetInfo().then(records => { console.log(records) })
注意:不要试图在同步代码流里直接拿async函数的返回值,异步逻辑的结果永远只能在await之后、或者then的回调里拿到。
内容的提问来源于stack exchange,提问作者M.K.
相关产品推荐
相关产品推荐

