You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何async函数返回Promise{<pending>}?JavaScript代码问题问询

为什么调用async函数返回的是pending状态的Promise?

这个问题其实是async/await机制里一个很常见的误区,咱们一步步理清楚:

核心原因:async函数的返回值永远是Promise

不管你在async函数内部return的是普通值、对象还是另一个Promise,async函数本身一定会把这个返回值包装成一个Promise对象返回给调用者。这是async函数的固有特性,也是它处理异步逻辑的核心设计。

具体执行过程拆解

  1. 当你执行const game = buildMap()时,buildMap作为async函数会立刻启动执行,但遇到await readFile(...)时,函数会暂停执行,同时立刻返回一个处于pending状态的Promise——这就是你console.log(game)看到Promise { <pending> }的原因。
  2. 之后,readFile的Promise完成(成功读取文件),buildMap函数恢复执行,await拿到文件内容赋值给map,此时console.log(map)自然能输出正确的文件内容。
  3. 最后return map,这个map会被自动包装成一个resolved状态的Promise,作为buildMap()返回的那个Promise的最终结果,但这个过程是在你第一次console.log(game)之后才发生的,所以一开始看到的就是pending状态。

如何正确获取最终的map值?

如果你想拿到buildMap()的最终结果,有两种常见方式:

方式1:用await调用(需放在async函数内部)

const fs = require('fs')
const util = require('util')
const readFile = util.promisify(fs.readFile)

const buildMap = async () => {
  let map = await readFile(process.argv[2], { encoding: 'utf-8' })
  console.log(map)
  return map
}

// 用async函数包裹,通过await获取结果
async function initGame() {
  const game = await buildMap()
  console.log(game) // 这里就能输出正确的文件内容
}
initGame()

方式2:用Promise的.then()方法

const fs = require('fs')
const util = require('util')
const readFile = util.promisify(fs.readFile)

const buildMap = async () => {
  let map = await readFile(process.argv[2], { encoding: 'utf-8' })
  console.log(map)
  return map
}

buildMap().then(game => {
  console.log(game) // 这里也能输出正确的文件内容
})

内容的提问来源于stack exchange,提问作者Yamboy1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:25:58