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
相关产品推荐
相关产品推荐

