调用JavaScript异步函数报错:then不是函数及await关键字异常
问题解决
错误1:getUsersList(db).then is not a function
这个报错的核心是调用getUsersList(db)时,它没返回预期的Promise对象,结合你的代码来看,主要有两个原因:
- 代码存在语法缺失:你提供的片段里,
App函数的if语句块、then的回调函数都没闭合(缺少}),语法错误会让JS引擎无法正确识别getUsersList这个async函数的结构,导致返回值异常。 auth.currentUser是同步获取的初始值,页面加载时它大概率为null,这会导致getUsersList根本没被执行,你可能误把其他值当成了它的返回结果。
修复步骤:
- 先补全代码的闭合括号,保证语法正确:
async function getUsersList(db) { const userCol = collection(db, 'Users'); const userSnapshot = await getDocs(userCol); const tempUserList = userSnapshot.docs.map(doc => doc.data()); return tempUserList; } function App() { const app = initializeApp(firebaseConfig); const db = getFirestore(app); const auth = getAuth(app); var currentUser = auth.currentUser; if(currentUser != null){ getUsersList(db).then((value) => { console.log(value); }); // 补全then的闭合括号 } // 补全if的闭合括号 } // 补全App函数的闭合括号
- 改用Firebase的
onAuthStateChanged监听用户登录状态,因为auth.currentUser不会自动更新,监听才能准确获取登录后的用户:
function App() { const app = initializeApp(firebaseConfig); const db = getFirestore(app); const auth = getAuth(app); // 监听用户登录状态变化 onAuthStateChanged(auth, (user) => { if (user) { // 用户已登录,调用异步函数 getUsersList(db).then((value) => { console.log(value); }); } }); }
错误2:Unexpected reserved word 'await'
await只能在async函数内部使用,你直接在普通的App函数里用await就会触发这个错误。
修复方法:
把调用getUsersList的逻辑放在async函数里,比如结合上面的登录监听:
function App() { const app = initializeApp(firebaseConfig); const db = getFirestore(app); const auth = getAuth(app); onAuthStateChanged(auth, async (user) => { if (user) { // 这里是async函数,可以用await const userList = await getUsersList(db); console.log(userList); } }); }
如果是在React组件中,更规范的做法是把异步逻辑放在useEffect钩子中:
import { useEffect } from 'react'; function App() { const app = initializeApp(firebaseConfig); const db = getFirestore(app); const auth = getAuth(app); useEffect(() => { const fetchUsers = async () => { const user = auth.currentUser; if (user) { const userList = await getUsersList(db); console.log(userList); } }; // 监听用户状态 const unsubscribe = onAuthStateChanged(auth, fetchUsers); // 组件卸载时取消监听 return unsubscribe; }, [auth, db]); return <div>你的组件内容</div>; }
内容的提问来源于stack exchange,提问作者user567
相关产品推荐
相关产品推荐

