javascript 如何在异步函数中获取异步函数而不出现Uncatch(in promise)错误

5n0oy7gb  于 2023-03-06  发布在  Java
关注(0)|答案(1)|浏览(132)

在我的login.js文件中,有一个异步登录函数,我试图使用helper.js文件中的另一个异步函数获取用户的IP地址。

    • 登录. js**
login: async ({ dispatch, commit }, firebaseAuthUser) => { 
    const usersDb = new UsersDB(firebaseAuthUser.uid)
    const userFromFirebase = await usersDb.read(firebaseAuthUser.uid)
    let user = null
    let ip = null

    if (!isNil(userFromFirebase)) {
      const increment = firebase.firestore.FieldValue.increment(1)

      setTimeout(() => {
        getUserIPAddress().then((d) => {
          ip = d
          console.log(ip)
        })
      }, '3000')

      console.log(ip)
      usersDb.update({
        id: firebaseAuthUser.uid,
        loginCount: increment,
        lastLoginTimestamp: firebase.firestore.FieldValue.serverTimestamp(),
        lastKnownIpAddress: ip,
      })
      user = userFromFirebase
    } else {
      user = await createNewUserFromFirebaseAuthUser(firebaseAuthUser)
    }
    • 助手. js**
export async function getUserIPAddress() {
  const fetchRes = fetch('https://api.ipify.org/?format=json')
  fetchRes
    .then((res) => res.json())
    .then((d) => {
      console.log(d.ip)
      return String(d.ip)
    })
}

控制台日志如下:
未捕获(承诺中)Firebase错误:使用无效数据调用了函数DocumentReference. update()。不支持的字段值:未定义(在文档users/KIucHorN8LMvfLcEDB0uo9VqOEB2的字段lastKnownIpAddress中找到)
然后浏览器在helper.js文件中显示console.log。
我试图在另一个异步函数中调用一个异步获取函数,但我似乎无法让它们等待,从而导致错误。
我试着在登录文件中用. then()链接,但没有成功。我试着删除所有异步和等待关键字,并作为常规函数运行,但没有成功。

pw9qyyiw

pw9qyyiw1#

async function getUserIPAddress不返回任何值,它是async没有任何原因,因为您从未在其中使用过await
此外,您还将对该函数的调用封装在setTimeout中,这意味着即使它确实返回了值,变量ip也仍然是未定义的
尝试更改代码如下:

login: async ({dispatch, commit}, firebaseAuthUser) => {
    const usersDb = new UsersDB(firebaseAuthUser.uid);
    const userFromFirebase = await usersDb.read(firebaseAuthUser.uid);
    let user = null;
    let ip = null;

    if (!isNil(userFromFirebase)) {
        const increment = firebase.firestore.FieldValue.increment(1);
        // do you REALLY need to wait 3 seconds here, 
        // or was your setTimeout due to not understanding asynchrony?
        await new Promise(resolve => setTimeout(resolve, 3000));
        ip = await getUserIPAddress();
        console.log(ip);
        usersDb.update({
            id: firebaseAuthUser.uid,
            loginCount: increment,
            lastLoginTimestamp: firebase.firestore.FieldValue.serverTimestamp(),
            lastKnownIpAddress: ip,
        });
        user = userFromFirebase;
    } else {
        user = await createNewUserFromFirebaseAuthUser(firebaseAuthUser);
    }

以及

export async function getUserIPAddress() {
    const res = await fetch('https://api.ipify.org/?format=json');
    const d = await res.json();
    console.log(d.ip)
    return String(d.ip)
}

相关问题