axios 使用第一次调用的响应在第二次调用中使用,这是一种好方法吗?

o8x7eapl  于 2022-11-29  发布在  iOS
关注(0)|答案(1)|浏览(120)

我是Reactjs的新手,我想把2个请求链接在一起。它很有效,但我想知道是否有更好的方法来做到这一点。
这是我的代码

const [data, setData] = useState([]);
const [data2, setData2] = useState([]);
useEffect(() => {
    axios.get(api, config)
        .then(res => {
            setData(res.data);
        })
        .then(res => {
            let id = data.compte.id;
            axios.get(`http://localhost:8000/api/compte/${id}`, config).then(res => {
                setData2(res.data);
            })
        })
        .catch(err => {
            console.log(err);
        })
}, []);
am46iovg

am46iovg1#

你很接近了,但有几个问题:
1.您没有从Promise处理程序返回任何内容,因此某些变量未定义。
1.(与#1相关)基本上没有理由嵌套.then
1.正如collinD在评论中指出的那样,你在第二次调用时不会出现任何错误。
1.对于错误,您可能需要console.error,而不是console.log

const [data, setData] = useState([]);
const [data2, setData2] = useState([]);
useEffect(() => {
    axios.get(api, config)
        .then(res => {
            setData(res.data);
            let id = res.data.compte.id;
            return axios.get(`http://localhost:8000/api/compte/${id}`, config)
        })
        .then(setData2)
        .catch(err => {
            console.error(err);
        })
}, []);

如果使用async/await,整个事情看起来会更干净:

const [data, setData] = useState([]);
const [data2, setData2] = useState([]);
useEffect(() => {
  const fn = async () => {
    try {
      const res = await axios.get(api, config);
      setData1(res);
      const id = res.data.compte.id;
      const res2 = await axios.get(`http://localhost:8000/api/compte/${id}`, config);
      setData2(res2);
    } catch (err) {
      console.error(err);
    }
  }

  fn();
}, []);

相关问题