如何从异步存储中获取项目,在键中设置值,然后使用该值向 api 发出 axios 请求以获得响应?

how to get item from async storage, set the value in a key and then with that value make an axios request to api for response?

我一直在尝试从 AsyncStorage 中检索数据,我正在成功地做这件事,之后我解决了承诺并尝试将我的 userObject 键设置为结果,设置后我想调用 axios api,但每当我这样做时,我都会收到未定义的值,因为两者都是异步请求,根本无法修复错误,我尝试了多种方法,例如,在解析 asyncstorage 时。然后进行 axios 调用,但这不起作用,我已经使用 userObject 重新渲染 useEffect,但是 api 被调用了 N 次。显然这是一个糟糕的修复,下面是我的代码

import React, {useEffect, useState} from 'react';
import {
  View,
  ScrollView,
  ActivityIndicator,
  Text,
  TouchableOpacity,
} from 'react-native';
import AsyncStorage from '@react-native-community/async-storage';
import HomeTabAssessmentCardComponent from './components/HomeTabAssessmentCardComponent';
import {API} from '../../api';
import HomeTabOverAllDevelopmentCardComponent from './components/HomeTabOverAllDevelopmentCardComponent';
import HomeTabPhysicalGrowthCardComponent from './components/HomeTabPhysicalGrowthCardComponent';
import HomeTabExpertCardComponent from './components/HomeTabExpertCardComponent';
import HomeTabPremiumCardComponent from './components/HomeTabPremiumCardComponent';
import HomeTabPrimeCardComponent from './components/HomeTabPrimeCardComponent';
import HomeTabWeekWiseImagesCardComponent from './components/HomeTabWeekWiseImagesCardComponent';

export default function HomeTabScreen(props) {
  console.log(
    ' ~ file: HomeTabScreen.js ~ line 12 ~ HomeTabScreen ~ props',
    props,
  );
  const {navigation} = props;
  const mHomeTabResponse = null;
  const [mainResponse, setMainResponse] = useState([]);
  const [mAssessmentList, setAssessmentList] = useState([]);
  const [mWeekWiseMediaList, setWeekWiseMedialist] = useState([]);
  const [title, setTitle] = useState('');
  const [text, setText] = useState('');
  const [loading, setLoading] = useState(true);
  const [userObject, setUserObject] = useState({});
  useEffect(() => {
    getData();
    getHomeTabMainAPI();
  }, [userObject]);

  const getData = () => {
    try {
      const jsonValue = AsyncStorage.getItem('user_object').then(
        (result) =>
          // console.log('result', JSON.parse(result)),
          setUserObject(JSON.parse(result)),

        // console.log('userssss', userObject),
      );
    } catch (e) {
      console.log(e);
    }
  };
  const getHomeTabMainAPI = async () => {
    try {
      const response = await API.get(
        `fist part of api?child_id=${userObject.children[0].id}last part of api`,
      );
      console.log('res', response);

      setAssessmentList(response.data.content.assessments.data);
      setWeekWiseMedialist(response.data.content.media_cards.data);
      setTitle(response.data.content.assessments.title);
      setText(response.data.content.assessments.text);

      setMainResponse(response.data.content.assessments.data);
      setLoading(false);
    } catch (e) {
      setLoading(false);
    }
  };
  const logoutHandler = () => {
    try {
      AsyncStorage.removeItem('user_object').then(navigation.navigate('login'));
    } catch (e) {
      console.log(e);
    }

    console.log('Done.');
  };
  if (loading) {
    return (
      <View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
        <ActivityIndicator size="large" color="#FE017E" />
      </View>
    );
  }

  return (
    <ScrollView showsVerticalScrollIndicator={false}>
      <View style={{backgroundColor: '#fff', width: '100%', padding: 10}}>
        <TouchableOpacity
          style={{
            marginLeft: '80%',
          }}
          onPress={() => logoutHandler()}>
          <Text style={{fontSize: 15, fontWeight: 'bold', color: '#000'}}>
            Log out
          </Text>
        </TouchableOpacity>
      </View>
      <View style={{paddingBottom: 58}}>
        {/* {console.log('view mWeekWiseMediaList - ' + mWeekWiseMediaList)} */}
        {mWeekWiseMediaList !== null && mWeekWiseMediaList.length > 0 ? (
          <HomeTabWeekWiseImagesCardComponent data={mWeekWiseMediaList} />
        ) : (
          <Text></Text>
        )}
        <HomeTabOverAllDevelopmentCardComponent />
        <HomeTabPremiumCardComponent />
        {mAssessmentList &&
          mAssessmentList != '' &&
          mAssessmentList != null &&
          mAssessmentList.length > 1 &&
          userObject != null &&
          userObject != '' &&
          userObject != undefined &&
          userObject.children[0] &&
          userObject.children[0] != null &&
          userObject.children[0] != undefined &&
          userObject.children[0] != '' && (
            <HomeTabAssessmentCardComponent
              data={mAssessmentList}
              title={title}
              text={text}
              navigation={props}
              children={userObject.children[0].id}
            />
          )}

        <HomeTabPrimeCardComponent />
        <HomeTabPhysicalGrowthCardComponent />
        <HomeTabExpertCardComponent />
      </View>
    </ScrollView>
  );
}

正如您在我的端点中看到的那样 fist part of api?child_id=${userObject.children[0].id}last part of api 我需要调用 userObject.children[0].id 键并且它不应该为空。

长期以来一直坚持这个问题,任何线索都将不胜感激。 如果需要更好地理解,请告诉我。

您的 API 调用不会等待 getData 方法完成,因为这两个方法是 运行 并行的。我猜测此 user_object 在此屏幕上永远不会为空或未定义(希望您已经在更高级别检查此值,也许在您的路由器定义中)。如果是这样,您最初可以将 userObject 设置为 null

const [userObject, setUserObject] = useState(null);

在您的 userObject 副作用中,添加以下检查,

useEffect(() => {
  if(userObject)
    getHomeTabMainAPI(); 
  else
    getData();
}, [userObject]);

这样,最初将调用 getData() 方法,该方法将从 AsyncStorage 获取数据并设置 userObject。 userObject 中的更改会触发副作用,这次会 运行 getHomeTabMainAPI()