开发者问题收集

对 firebase 的异步和等待调用不会等待

2020-03-31
181

我有一个类似约会的应用程序,每次用户单击“连接”选项卡按钮时,我都希望能够查询新的匹配项。

我不确定我是否错误地编写了 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(); 
  }, []);

此外,当我尝试取消订阅时,当用户来回导航时,侦听器似乎不起作用。任何有关我在异步调用和侦听器方面做错什么的帮助都将不胜感激。

3个回答

我认为你只是忘记了函数中的 await 关键字 我一直都遇到这种情况哈哈哈

2020-03-31

我建议在 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();
});
William Goodwin
2020-03-31

我发现了这个问题。我使用的是 react-navigation V3,它已经严重过时,与我的 react-native 和 expo 版本冲突。

我正在更新所有内容(RN > .60、EXPO sdk > 35、@react-navigation V5),并且能够在我的 getMatches() 方法上使用 @react-navigation v5 的监听器。

Olivia
2020-04-21