Javascript 如何等待setTimeout函数中的代码,直到从另一个异步函数获得响应

Javascript 如何等待setTimeout函数中的代码,直到从另一个异步函数获得响应,javascript,reactjs,react-native,Javascript,Reactjs,React Native,我在react native中创建了一个启动屏幕,在从getUser函数获得响应之前,我在setTimeout函数中的代码会运行 另外,当我记录userrrrrr时,我会得到一个具有未知值的对象,如-{“\U:0”,“\U V:0”,“\U W:null”,“\U X:null}userrrrrr 我想要的是,setTimeout函数中的代码仅在我从getUser函数获得正确响应时运行 // //一种方法是将getUser响应保存在状态变量中,并在状态更改时让useffect运行。在setTim

我在react native中创建了一个启动屏幕,在从getUser函数获得响应之前,我在setTimeout函数中的代码会运行

另外,当我记录userrrrrr时,我会得到一个具有未知值的对象,如-{“\U:0”,“\U V:0”,“\U W:null”,“\U X:null}userrrrrr

我想要的是,setTimeout函数中的代码仅在我从getUser函数获得正确响应时运行

//


//一种方法是将getUser响应保存在状态变量中,并在状态更改时让
useffect
运行。在
setTimeout
中,在执行逻辑之前,检查用户状态是否持有有效值(非空)

const[user,setUser]=useState(null)//null的默认值
const getUser=async()=>{
...
//获得成功响应后,更新状态
设置用户(响应)
...
}
useffect(()=>{
getUser()
},[])//没有依赖项,因此仅当组件装载时才会运行
useffect(()=>{
设置超时(()=>{
如果(user!=null){//请在此处检查用户有效性!
log({user});
导航。替换(“抽屉”);
}否则{
console.log({user});//应为null
navigation.replace('Login');
}
}, 5000);
},[user])//在本地用户状态更新时运行
您可能根本不需要
setTimeout
,使用上述方法,您可以在用户数据处于状态时进行导航-

const [loading, setLoading] = useState(true)

const getUser = async () => {
  setLoading(true)
  ...
  // When you get a successful response, update the state
  setUser(response)
  setLoading(false)
  ...
}

useEffect(() => {
  if (!loading) {
    if (user != null) { // Check user validity here!
      console.log({ user });
      navigation.replace('Drawer');
    } else {
      console.log({ user }); // Should be null
      navigation.replace('Login');
    }
  }
}, [user])

谢谢@shimb,它成功了@shahbaazahmad!如果你愿意接受后人的回答,那就太好了。
    useEffect(async () => {
    const user = await getUser() 
    setTimeout(() => {
      if (user) {
        console.log(getUser(), 'userrrrrrrr');
        navigation.replace('Drawer');
      } else {
        console.log(getUser(), 'userrrrrrrr111111');
        navigation.replace('Login');
      }
    }, 5000);
  }, []);
  const getUser = async () => {
    try {
      const jsonValue = await AsyncStorage.getItem('currentUser');
      if (jsonValue) {
        console.log(jsonValue, 'jjjjjj');
        return jsonValue;
      } else {
        console.log('else');
        return false;
      }
    } catch (e) {
      console.log('catch');
      return false;
    }
  };

  useEffect(aync () => {
    setTimeout(() => {
      const result = await getUser()
      if (result) {
        navigation.replace('Drawer');
      } else {
        navigation.replace('Login');
      }
    }, 5000);
  }, []);
const [loading, setLoading] = useState(true)

const getUser = async () => {
  setLoading(true)
  ...
  // When you get a successful response, update the state
  setUser(response)
  setLoading(false)
  ...
}

useEffect(() => {
  if (!loading) {
    if (user != null) { // Check user validity here!
      console.log({ user });
      navigation.replace('Drawer');
    } else {
      console.log({ user }); // Should be null
      navigation.replace('Login');
    }
  }
}, [user])