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

异步函数内调用异步IP获取函数,如何避免未捕获Promise错误?

问题修复方案

核心问题分析

  1. getUserIPAddress函数未正确返回IP值:这个异步函数内部用了then链式调用,但没有返回整个Promise链,导致调用后实际拿到的是undefined,而非IP地址。
  2. 异步操作顺序错误:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:35:24