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

Node.js中解决Promise {<pending>}问题并全局使用Promise结果

解决async函数返回Promise而非预期值的问题

这个问题我太熟悉啦!你遇到的是async/await最常见的坑之一——async函数本身就会返回一个Promise对象,不管你在里面return什么值,都会被自动包装成Promise。所以直接执行var a = app()时,拿到的并不是最终的城市名,而是处于pending状态的Promise,这就是为什么你会看到a-> Promise { <pending> }的输出。

怎么解决?

有几种简单的方式能让你拿到预期的结果:

1. 在另一个async函数里使用await调用

你可以把后续需要使用变量a的逻辑放在一个async函数里,用await等待app()的结果:

async function run() {
  var a = await app();
  console.log("a->", a); // 这里会输出Lyon
  // 在这里可以继续使用a做其他操作
}
run();

2. 用Promise的.then()链式调用

既然app()返回的是Promise,你可以直接用.then()方法来获取结果:

app().then(a => {
  console.log("a->", a); // 输出Lyon
  // 这里处理a的逻辑
});

3. 全局作用域下用立即执行的async函数(IIFE)

如果不想额外定义函数,也可以用立即执行的async函数来在全局获取结果:

(async () => {
  var a = await app();
  console.log("a->", a); // 输出Lyon
})();

优化你的原代码(可选)

另外,你的goecoderPromiseFunction其实没必要手动包装一层Promise,因为geocoder.reverse()本身就返回Promise,直接简化它会更简洁:

// 简化版1:用.then()
function goecoderPromiseFunction() {
  return geocoder.reverse({ lat: 45.767, lon: 4.833 })
    .then(data => data[0].city)
    .catch(err => {
      console.log(err);
      throw err; // 抛出错误让Promise进入reject状态,避免后续逻辑拿到undefined
    });
}

// 简化版2:用async/await更直观
async function goecoderPromiseFunction() {
  try {
    const data = await geocoder.reverse({ lat: 45.767, lon: 4.833 });
    return data[0].city;
  } catch (err) {
    console.log(err);
    throw err;
  }
}

记住核心要点:await只能在async函数内部使用,如果想在async函数外部获取异步结果,要么用Promise的.then()方法,要么把逻辑放在另一个async函数里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:50:06