如何根据第一个响应进行第二个API调用?

时间:2019-08-06 12:39:26

标签: javascript reactjs axios

我需要调用2个API来在组件上显示数据,但是第二个api需要第一个API的响应中的标头。 我正在使用React Hooks。我从第一个响应中更新状态,以便以后可以在第二个调用中使用它,但是它不确定。我在做什么错了?

使用P.s进行呼叫的更好方法(也许使用async / await)

 const [casesHeaderFields, setCasesHeaderFields] = useState([]);
 const [casesFields, setCasesFields] = useState([]);

  useEffect(() => {
    const fetchData = () => {
      const result1 = axios
        .get(`firstUrl`)
        .then(response => {
         //I need this as headers for my second API
          setCasesHeaderFields(
            response.data.result.fields
          );
        });

      const result2 = axios
        .get(`url${casesHeaderFields} //here i want to pass params from 
         //first response)
        .then(response => {
          setCasesFields(response.data.result.record_set);
        });
    };
    fetchData();
  }, []);

5 个答案:

答案 0 :(得分:7)

您可以将结果链接为常规承诺: Ref

axios.get(...)
  .then((response) => {
    return axios.get(...); // using response.data
  })
  .then((response) => {
    console.log('Response', response);
  });

答案 1 :(得分:2)

在。内进行第二次调用,然后链接到第一个诺言链的末尾...简单来说,就是将您的诺言链化

类似

useEffect(() => axios.get(`firstUrl`)
    .then(response => {
        setCasesHeaderFields(response.data.result.fields);
        return response.data.result.fields;
    })
    .then(casesHeaderFields => axios.get(`url${casesHeaderFields}`))
    .then(response => {
        setCasesFields(response.data.result.record_set);
    }), []);

答案 2 :(得分:1)

您可以这样写:

  useEffect(() => {
      return axios
        .get(`firstUrl`)
        .then(response => {
          return response.data.result.field
        }).then(result => { 
         return axios.get(`url${result}`)
        });
   });

使用异步/等待:

  useEffect(async () => {
      const result1 = await axios
        .get(`firstUrl`)
        .then(response => {
          return response.data.result.field
        });
      const result2 = await axios.get(`url${result1}`)
      return result2 
   });

答案 3 :(得分:1)

查询result1result2看起来是顺序的,但同时存在。换句话说,result2不会等待result1完成才被执行。

这是一个使用async / await链接诺言的有效示例:

useEffect(async () => {
  try {
    // Make a first request
    const result1 = await axios.get(`firstUrl`);
    setCasesHeaderFields(result1.data.result.fields);

    // Use resutlt in the second request
    const result2 = await axios.get(`url${"some params from result1"}`);
    setCasesFields(result2.data.result.record_set);
  } catch (e) {
    // Handle error here
  }
}, []);

编辑

基于注释,这是在控制台中不带警告地使用useEffect异步的最佳方法:

useEffect(() => {
  const fetchData = async () => {
    try {
      // Make a first request
      const result1 = await axios.get(`firstUrl`);
      setCasesHeaderFields(result1.data.result.fields);

      // Use resutlt in the second request
      const result2 = await axios.get(`url${casesHeaderFields}`);
      setCasesFields(result2.data.result.record_set);
    } catch (e) {
      // Handle error here
    }
  };

  fetchData();
}, []);

答案 4 :(得分:1)

您可以使用async/await来缓解混乱。

useEffect(async () => {
    const response = await axios.get(`firstUrl`)
    const result = await axios.get(`url${response.data.result.fields}`)
    console.log(result.data)
})