对 firebase 的异步和等待调用不会等待
我有一个类似约会的应用程序,每次用户单击“连接”选项卡按钮时,我都希望能够查询新的匹配项。
我不确定我是否错误地编写了 await 或 async,但如果用户移动速度太快而数据库无法返回结果,则返回的匹配项加载速度不够快。到目前为止,我的情况是:在页面加载时,我调出 Firebase,当用户离开然后导航回“连接”选项卡时,我会回调 Firebase。
getMatches()
方法是对 firebase 的调用。
const MatchesScreen = ({navigation}) => {
const {state, updateDislikedQueue, updateLikedQueue, getMatches} = useContext(AuthContext);
const [loaded, setLoaded] = useState(false);
const [queue, setQueue] = useState({});
const [noMatches, setNoMatches] = useState(false);
const [updateProfileAndPreferences,setUpdateProfileAndPreferences] = useState(false);
const getMatchesMethod = async () => {
getMatches().then(matches => {
if (!matches) {
Alert.alert("Update Preferences and Profile before connecting");
setUpdateProfileAndPreferences(true);
} else {
setUpdateProfileAndPreferences(false);
let cardData = [];
for (m in matches) {
if (matches[m].id == state.id) {
continue;
} else {
let user = {
id: matches[m].id,
fullName: matches[m].info.fullName
};
cardData.push(user);
}
}
if (cardData.length > 0) {
setQueue(cardData);
setLoaded(true);
} else {
setNoMatches(true);
Alert.alert("No Connections Available");
}
}
});
};
useEffect(() => {
getMatchesMethod();
const unsubcribe = navigation.addListener("willFocus", () => {
getMatchesMethod();
});
// return unsubcribe.remove();
}, []);
此外,当我尝试取消订阅时,当用户来回导航时,侦听器似乎不起作用。任何有关我在异步调用和侦听器方面做错什么的帮助都将不胜感激。
我认为你只是忘记了函数中的 await 关键字 我一直都遇到这种情况哈哈哈
我建议在 getMatches() 前面使用
await
关键字,而不是 .then() 语法。它使代码读取更加同步,并且有助于防止错误。必须始终从异步函数调用 Await。它不能从非异步函数调用。
我认为您还需要在 getMatchesMethod() 前面使用 await;
查看本文以获取有关在 useEffect() 内调用异步代码的帮助 https://medium.com/javascript-in-plain-english/how-to-use-async-function-in-react-hook-useeffect-typescript-js-6204a788a435
例如:
const unsubcribe = navigation.addListener("willFocus", async () => {
await getMatchesMethod();
});
我发现了这个问题。我使用的是 react-navigation V3,它已经严重过时,与我的 react-native 和 expo 版本冲突。
我正在更新所有内容(RN > .60、EXPO sdk > 35、@react-navigation V5),并且能够在我的 getMatches() 方法上使用 @react-navigation v5 的监听器。