异步函数内调用异步IP获取函数,如何避免未捕获Promise错误?
问题修复方案
核心问题分析
getUserIPAddress函数未正确返回IP值:这个异步函数内部用了then链式调用,但没有返回整个Promise链,导致调用后实际拿到的是undefined,而非IP地址。- 异步操作顺序错误:用
setTimeout包裹IP获取逻辑,并且没有等待IP获取完成就执行了usersDb.update,此时ip变量还没被赋值,自然是undefined。
修复步骤
1. 修复helper.js中的getUserIPAddress函数
把函数改成正确返回Promise的形式,两种写法任选:
写法一(用await简化):
export async function getUserIPAddress() { const res = await fetch('https://api.ipify.org/?format=json'); const data = await res.json(); console.log(data.ip); return String(data.ip); }
写法二(保持then链式):
export function getUserIPAddress() { // 可去掉async,直接返回Promise return fetch('https://api.ipify.org/?format=json') .then((res) => res.json()) .then((d) => { console.log(d.ip); return String(d.ip); }); }
2. 修复login.js中的login函数
去掉多余的setTimeout,等待IP获取完成后再执行更新操作:
login: async ({ dispatch, commit }, firebaseAuthUser) => { const usersDb = new UsersDB(firebaseAuthUser.uid); const userFromFirebase = await usersDb.read(firebaseAuthUser.uid); let user = null; if (!isNil(userFromFirebase)) { const increment = firebase.firestore.FieldValue.increment(1); // 等待IP获取完成 const ip = await getUserIPAddress(); console.log(ip); // 拿到IP后再执行更新 usersDb.update({ id: firebaseAuthUser.uid, loginCount: increment, lastLoginTimestamp: firebase.firestore.FieldValue.serverTimestamp(), lastKnownIpAddress: ip, }); user = userFromFirebase; } else { user = await createNewUserFromFirebaseAuthUser(firebaseAuthUser); } // 可补充后续逻辑,比如commit用户信息等 }
为什么之前的尝试无效?
- 用
then链式调用但没处理函数本身的返回值问题,导致还是拿不到IP; - 移除
async/await改成普通函数,但没调整异步操作的执行顺序,更新操作依然在IP获取前执行。
内容的提问来源于stack exchange,提问作者Frontend Backend Bookend
相关产品推荐
相关产品推荐

