在我的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()链接,但没有成功。我试着删除所有异步和等待关键字,并作为常规函数运行,但没有成功。
1条答案
按热度按时间pw9qyyiw1#
async function getUserIPAddress
不返回任何值,它是async
没有任何原因,因为您从未在其中使用过await
。此外,您还将对该函数的调用封装在
setTimeout
中,这意味着即使它确实返回了值,变量ip
也仍然是未定义的尝试更改代码如下:
以及