Javascript 如何等待setTimeout函数中的代码,直到从另一个异步函数获得响应
我在react native中创建了一个启动屏幕,在从getUser函数获得响应之前,我在setTimeout函数中的代码会运行 另外,当我记录userrrrrr时,我会得到一个具有未知值的对象,如-{“\U:0”,“\U V:0”,“\U W:null”,“\U X:null}userrrrrr 我想要的是,setTimeout函数中的代码仅在我从getUser函数获得正确响应时运行 //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
//一种方法是将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])