代码之家  ›  专栏  ›  技术社区  ›  Faishal Irawan

处理多个ajax请求,只处理最后一个请求

  •  0
  • Faishal Irawan  · 技术社区  · 8 年前

    我正在做一个项目,使用react从SWAPI(人、行星等)获取不同类型的数据,但是我有一个问题是多个 Ajax 请求。

    问题是,当我迅速要求从2个不同的 URL 例如,'species'和'people',我的最后一个请求是'species',但是'people'的加载时间较长,我将取而代之的是'people'。 我想要的是得到上一次点击请求的数据,如果这有意义的话。

    我如何做到这一点?我从Google找到的所有解决方案都使用jQuery。

    这是我的一段代码 src/app.js (根元素):

    constructor(){
      super();
      this.state = {
        searchfield: '',
        data: [],
        active: 'people'
     }
    }
    
    componentDidMount() {
      this.getData();
    }
    
    componentDidUpdate(prevProps, prevState) {
      if(this.state.active !== prevState.active) {
        this.getData();
      }
    }
    
    getData = async function() {
      console.log(this.state.active);
      this.setState({ data: [] });
      let resp = await fetch(`https://swapi.co/api/${this.state.active}/`);
      let data = await resp.json();
      let results = data.results;
      if(data.next !== null) {
        do {
          let nextResp = await fetch(data.next);
          data = await nextResp.json();
          let nextResults = data.results
          results.push(nextResults);
          results = results.reduce(function (a, b) { return a.concat(b) }, []);
        } while (data.next);
      }
      this.setState({ data: results});
    }
    
    categoryChange = (e) => {
      this.setState({ active: e.target.getAttribute('data-category') });
    }
    
    render() {
      return (
        <Header searchChange={this.searchChange} categoryChange={this.categoryChange}/>
      );
    }
    

    我对这个问题作了详细的描述 here . 抱歉,格式不好,我正在手机上写这个。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Alex Antonov    8 年前

    您必须将请求存储在某个位置,并通过只激活一个请求来放弃旧的请求。比如:

    getData = async function() {
      console.log(this.state.active);
      this.setState({ data: [] });
    
      // my code starts here
      if (this.controller) { controller.abort() }
      this.controller = new AbortController();
      var signal = controller.signal;
      let resp = await fetch(`https://swapi.co/api/${this.state.active}/`, { signal });
      let data = await resp.json();
      let results = data.results;
      if(data.next !== null) {
        do {
          let nextResp = await fetch(data.next);
          data = await nextResp.json();
          let nextResults = data.results
          results.push(nextResults);
          results = results.reduce(function (a, b) { return a.concat(b) }, []);
        } while (data.next);
      }
      this.setState({ data: results});
    }