【问题标题】:How To Abort Axios GET Request While State Is Updating?如何在状态更新时中止 Axios GET 请求?
【发布时间】:2019-09-08 16:32:21
【问题描述】:

我在单个表单提交时向 API 发出多个具有不同参数的异步 GET 请求,并在每次请求后更新状态。

唯一的问题是在之前的请求尚未完成的情况下提交表单。 (即在上一个请求仍在加载时提交表单)。尽管我在表单提交的开头清空了状态,但状态将填充先前请求和新请求的混合。这是因为之前的请求仍在运行。

我尝试取消 axios 但由于状态不断更新,我不清楚如何使用 componentDidUpdate() 或其他方法来中止请求。

<form onSubmit={searchFlights}>


searchFlights = async e => {
    e.preventDefault();
    this.setState({ flights: []});

   //Dummy Data: array of different parameters
    onDates = [1,2,3,4];
// Fetch result for each Day
    for (let i = 0; i < onDates.length; i++) {
      let onDate = onDates[i];

      const res = await axios.get(
        `API/?date_from=${onDate}`
      );
      const flightResult = res.data.data[0];

      this.setState({
        flights: [...this.state.flights, flightResult]
      }); //note the state is updating after each loop
   
    }

当在上一个请求运行时再次提交表单时,我希望它停止获取上一个请求,清除状态并仅获取新请求

【问题讨论】:

    标签: javascript reactjs get axios


    【解决方案1】:

    setState 是异步的,您将在下一个渲染周期中获得新状态。所以你做错了。为什么不将 axios 结果推送到数组中,并在循环后从数组中设置航班的状态?

    <form onSubmit={searchFlights}>
    
    
    searchFlights = async e => {
        e.preventDefault();
        const flights =[];
    
       //Dummy Data: array of different parameters
        onDates = [1,2,3,4];
    
      // Fetch result for each Day
        for (let i = 0; i < onDates.length; i++) {
          let onDate = onDates[i];
    
          const res = await axios.get(
            `API/?date_from=${onDate}`
          );
          const flightResult = res.data.data[0];
    
        flights.push[flightResult]
        }
        this.setState({flights});
    

    【讨论】:

    • 还是没有解决问题。如果我提交一个表单并且在加载时提交另一个表单,它将显示第一个请求的结果,一旦第二个请求完成,它将显示。如果表单提交损坏,我需要一种方法来停止获取请求并启动新请求
    • 哦,我明白了。如果您进行另一次提交,您是否希望第一次提交不通过?我对此一无所知。我假设第一次提交会通过,因为它已经在调用堆栈中。
    猜你喜欢
    • 2019-03-13
    • 2019-08-09
    • 2020-07-05
    • 2018-06-22
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多