新手咨询:Async/Await调用返回Promise<Pending>的解决方法
如何正确获取异步函数返回的公网IP值
嗨,作为新手刚接触异步代码确实容易被Promise的状态搞晕,咱们一步步把这个问题理清楚~
首先先给你的GetIpAddress函数做个小优化:你里面写的return await a;其实没必要多一层await,因为a已经是await publicIp.v4()解析后的实际IP字符串了,直接return a就好,修改后的函数是这样:
const publicIp = require('public-ip'); async function GetIpAddress() { const ip = await publicIp.v4(); return ip; // 返回解析完成的公网IP字符串 }
接下来解决你最关心的问题:为什么直接调用会得到Promise<Pending>,以及怎么拿到实际的IP值。
为什么会出现Promise?
异步函数(带async关键字的函数)执行后,会立刻返回一个Promise对象,这时候里面的await publicIp.v4()还在后台执行网络请求,所以Promise处于「Pending(等待中)」状态。只有当网络请求完成,Promise才会变成「Fulfilled(成功)」状态,这时候才能拿到实际的IP值。
两种正确获取IP值的方法
方法1:用async/await包裹调用(推荐,代码更直观)
因为await只能在async函数内部使用,所以你可以写一个主函数来调用GetIpAddress,或者在Node.js的模块顶层直接用await(Node.js 14.8+支持):
// 写法1:用async主函数 async function main() { try { const myIp = await GetIpAddress(); console.log('我的公网IP是:', myIp); // 这里就能拿到实际的IP啦 } catch (err) { console.error('获取IP失败了:', err); // 别忘了处理可能的错误,比如网络问题 } } main(); // 执行这个主函数 // 写法2:模块顶层直接用await(Node.js 14.8+支持) // try { // const myIp = await GetIpAddress(); // console.log('我的公网IP是:', myIp); // } catch (err) { // console.error('获取IP失败了:', err); // }
方法2:用Promise的.then()方法
如果你还不太习惯async/await,也可以用Promise的.then()方法来处理成功的结果,.catch()处理错误:
GetIpAddress() .then(myIp => { console.log('我的公网IP是:', myIp); }) .catch(err => { console.error('获取IP失败了:', err); });
这样两种方法都能帮你拿到实际的公网IP值,而不是Pending状态的Promise啦~
内容的提问来源于stack exchange,提问作者sheevar
相关产品推荐
相关产品推荐

