关于React Native如何按顺序获取fetch api 问题

来源:7-1 本章目标

慕尼黑0536602

2022-05-18

hi 老师,
上次我问了您一个问题,就是如何让api按顺序执行,您跟我说使用async await .
我试了很多次,直到怀疑人生,还是没有成功。。麻烦您帮我看一下我的代码,是哪里出问题了?谢谢哈!
代码依次执行的顺序:
1.获得用户的token;
2.获取用户的data;
3.通过用户的id,获取该用户的所有朋友列表

   const [userToken,setUserToken] = useState('');
     const doInitialLaunch = async()=>{
    await storage.getToken().then(token=>setUserToken(token)).catch(error=>console.log("获取token发生错误:",error));
   
    if(userToken){
      await fetch(`${baseUrl}/getMe`,{
        method : "get",
        headers :new Headers({
          'Content-Type':'application/json',
          "Authorization": `Bearer ${userToken}`
         }),
      })
      .then(res=>res.json())
      .then(result =>{
        setMe(result.data);
        console.log("现在的me是:",me);
      })
      .catch(error =>console.log("收到的我的发生了错误:",error));
    }

    if(me?._id){
      await  fetch(`${baseUrl}/getSortedUsers`,{
        method:'post',
        headers :new Headers({
          'Content-Type':'application/json',
         }),
      })
      .then(res=>res.json())
      .then(result => setData(result.users))
      .catch(error =>console.log("获取全部用户错误:",error))
    }
  }

 
     useEffect(()=>{
    doInitialLaunch();
    return ()=>{
      unmounted = true;
    }
  },[userToken,unmounted]);
写回答

3回答

CrazyCodeBoy

2022-05-20

另外一个方式可以用一个变量来接受await后面执行的结果比如:
    var token=await storage.getToken();
然后
setUserToken(token)).catch(error=>console.log("获取token发生错误:",error));   
0
1
慕尼黑0536602
好的,谢谢老师
2022-05-20
共1条回复

CrazyCodeBoy

2022-05-20

你这个方式也是可以的。
0
0

慕尼黑0536602

提问者

2022-05-18

hi 老师,经过很多次尝试之后,我采用了一个笨办法,试出来了可行。不过如果您如果有更好的方案,也请您点播一下我哈。我把一些需要获取到的变量,都提取出来,然后放在useEffect中,这样虽然await需要时间,但是当获取到的时候,页面就会再次刷新。解决了只获得一次页面刷新,导致没办法执行后面的request的窘境,具体代码如下:

const baseUrl = "XXX/api/v1/userInfo";

const CardsListScreen = () => {

  let unmounted = false;//组件是否有卸载

  // const isFocused = useIsFocused();

  //init data

  const [userToken,setUserToken] = useState('');

  const [me,setMe] = useState({});

  const [_id,setId] = useState('');

  const [data,setData] = useState([]);


 

  const getUserToken = async()=>{

    await storage.getToken().then(token=>setUserToken(token)).catch(error=>console.log("获取token发生错误:",error));

  }


  useEffect(()=>{

    getUserToken();

    if(userToken&&!unmounted){

      fetch(`${baseUrl}/getMe`,{

        headers :new Headers({

          'Content-Type':'application/json',

          "Authorization": `Bearer ${userToken}`

         }),

      })

      .then(res=>res.json())

      .then(result=>{

        setMe(result.data);

        setId(me._id);

        console.log("首页收到的me是:",me?._id)

        if(me?._id){

          fetch(`${baseUrl}/getSortedUsers`,{

            method:'post',

            headers :new Headers({

              'Content-Type':'application/json',

             }),

             body : JSON.stringify({

               _id:me?._id

             })

          })

          .then(res=>res.json())

          .then(result => {

           console.log("获得全部用户:",result)

           setData(result.users);

          })

          .catch(error =>console.log("获取全部用户错误:",error))

        }

      })

      .catch(error =>console.log("收到的me发生错误:",error))

    }

  },[userToken,_id,unmounted])





0
0

RN入门到进阶,打造高质量上线App

解锁React Native开发应用新姿势,React Native新版本热门技术

3144 学习 · 3241 问题

查看课程