如何在反应中正确获得axios响应?

Posted

技术标签:

【中文标题】如何在反应中正确获得axios响应?【英文标题】:How to get axios response properly in react? 【发布时间】:2019-01-19 07:05:21 【问题描述】:

我正在尝试使用 axios 获取数据以获取搜索栏功能,但我无法让它工作。当我在下面的 searchForPlaces 函数中控制台登录 de 响应时,我得到了响应,但是当我在我的应用程序中调用它时,我得到了未定义。

这是我获取数据的函数,位于我的 utils.js 中:

export function searchForPlaces(dataToSearch) 
  const requestUrl = `https://api.mapbox.com/geocoding/v5/mapbox.places/$dataToSearch.json?access_token=$accessToken`;

  const result = axios
    .get(requestUrl)
    .then(response => 
      return response;
    )
    .catch(error => 
      return error;
    );

代码如下:

class App extends React.Component 
  renderSearchedPlaces() 
    console.log("render");
    return (
      <div>
        this.state.searchForPlacesResponse.data.features.forEach(place => 
          return <div>place</div>;
        )
      </div>
    );
  

  querySearchForPlaces() 
    this.searchInputTimeout ? clearTimeout(this.searchInputTimeout) : null;

    console.log(searchForPlaces(this.state.searchInputValue));
    this.searchInputTimeout = setTimeout(
      function() 
        let searchForPlacesResponse = searchForPlaces(
          this.state.searchInputValue
        );

        this.setState( searchForPlacesResponse );
      .bind(this),
      400
    );
  

  renderContent(item) 
    if (item === "share") 
      return (
        <React.Fragment>
          <h2>
            Share with your friends the places that you like(d), or
            dislike(d)...
          </h2>
          <div className="search-nearby">
            <div
              className=
                this.state.searchNearby === "search"
                  ? "search selected"
                  : "search"
              
              onClick=() => 
                this.state.searchNearby === "search"
                  ? null
                  : this.setState( searchNearby: "search" );
              
            >
              Search
            </div>
            <div
              className=
                this.state.searchNearby === "nearby"
                  ? "nearby selected"
                  : "nearby"
              
              onClick=() => 
                this.state.searchNearby === "nearby"
                  ? null
                  : this.setState( searchNearby: "nearby" );
              
            >
              Nearby
            </div>
          </div>
          <input
            className="search-input"
            type="text"
            placeholder="Search a place"
            value=this.state.searchInputValue
            onChange=e => this.setState( searchInputValue: e.target.value )
            onKeyUp=() => this.querySearchForPlaces()
          />
          this.state.searchForPlacesResponse
            ? this.renderSearchedPlaces()
            : null
        </React.Fragment>
      );
    
  

  // ...

【问题讨论】:

【参考方案1】:

axios 请求是异步的,所以你的searchForPlacesResponse 将是undefined

您可以改为返回 axios 请求,并在 querySearchForPlaces 中使用 then 等待承诺解决后再使用 setState

export function searchForPlaces(dataToSearch) 
  const requestUrl = `https://api.mapbox.com/geocoding/v5/mapbox.places/$dataToSearch.json?access_token=$accessToken`;

  return axios
    .get(requestUrl)
    .then(response => 
      return response.data;
    )
    .catch(error => 
      console.error(error);
    );


class App extends React.Component 
  // ...

  querySearchForPlaces() 
    this.searchInputTimeout ? clearTimeout(this.searchInputTimeout) : null;

    console.log(searchForPlaces(this.state.searchInputValue));
    this.searchInputTimeout = setTimeout(() => 
      searchForPlaces(this.state.searchInputValue)
        .then(searchForPlacesResponse => 
          this.setState( searchForPlacesResponse );
        );
    , 400);
  

  // ...

【讨论】:

非常感谢!有用!还要感谢格式化我的代码,你是如何添加颜色的? @Jérémy 不客气!您可以在问题中添加javascript 标签,它会自动突出显示语法,或者您可以像我一样在顶部添加评论&lt;-- language-all: lang-js --&gt;

以上是关于如何在反应中正确获得axios响应?的主要内容,如果未能解决你的问题,请参考以下文章

在 axios 响应做出反应后,如何有条件地重定向到页面?

在设置选项内的 axios 响应回调中更新反应数据 - Vue 3

如何在 React 中查看 axios 错误响应 JSON

如何将响应数据包含到 axios 响应中?

如何在反应中使用axios(post)

如何使用 axios all 将 axios 响应数据传递给 vue 3