如果不满足条件,我可以为 Axios Get Method 编写 if/else 语句吗?

Posted

技术标签:

【中文标题】如果不满足条件,我可以为 Axios Get Method 编写 if/else 语句吗?【英文标题】:Can I write a if/else statement for Axios Get Method if condition is not met? 【发布时间】:2018-05-25 13:03:23 【问题描述】:

我正在使用 Axios 在 ReactJS 中获取 API 数据。我设置了一个搜索查询,它将获取用户输入并将其与数据响应设置为状态的 API 匹配。我遇到了一个问题,如果我尝试接收的数据在 API 中不存在,则页面返回并显示以下错误:

Unhandled Rejection (TypeError): Cannot read property 'medium' of null

  32 |     title: response.data.name,
  33 |     summary: response.data.summary,
  34 |     rating: response.data.rating.average,
> 35 |     image: response.data.image.medium,
  36 |     genre: response.data.genres,
  37 |   );
  38 | )

有没有办法在 GET 请求中编写 if/else 语句来解决这个问题?

import React,  Component  from 'react';

import SearchResults from '../SearchResults/SearchResults';
import AddButton from '../AddButton/AddButton';
import axios from 'axios';

class Searchbar extends Component 
  constructor(props) 
    super(props);
    this.state = 
      searchTerm: ' ',
      title: ' ',
      summary: ' ',
      rating: ' ',
      image: ' ',
      genre: [],
    
  

  componentWillMount() 
    this.search();
  

  updateSearchHandler = (event) => 
    this.search(this.refs.query.value);
  

  search(query = "stranger-things") 
    const url = `http://api.tvmaze.com/singlesearch/shows?q=$query`;
    axios.get(url).then(response => 
      this.setState(
        title: response.data.name,
        summary: response.data.summary,
        rating: response.data.rating.average,
        image: response.data.image.medium,
        genre: response.data.genres,
      );
    )
  

  render() 
    let editedSummary = this.state.summary.replace(/(<p>|<b>|<\/p>|<\/b>)/g, '')
    let spiltGenre = this.state.genre.join(', ');

    return(
      <div>
        <input
          type="text"
          ref="query"
          onChange=this.updateSearchHandler/>

        <SearchResults
        showTitle=this.state.title
        showSummary=editedSummary
        showRating=this.state.rating
        showImage=this.state.image
        showGenre=spiltGenre/>

      <AddButton
        showTitle=this.state.title
        showGenre=spiltGenre/>
      </div>
    )
  


  export default Searchbar;

【问题讨论】:

【参考方案1】:

选项 1 - 三元运算符

您可以使用三元运算符来测试是否定义了response.data.image。如果是,则返回response.data.image.medium,如果不是,则返回null 或其他值。三元运算符的工作方式如下:

const isTrue = true;
const newVariable = (isTrue ? 'Its true' : 'Its false');

如果isTruetrue,那么newVariableIts true。如果isTruefalse,那么newVariableIts false

示例

这是一个简化的例子:

const response = 
  data: 
    name: "My Name",
    summary: "My Summary",
    rating: 
      average: "My Average"
    ,
    genres: "My genres"
  


const state = 
  title: response.data.name,
  summary: response.data.summary,
  rating: response.data.rating.average,
  image: response.data.image ? response.data.image.medium : "No image",
  genre: response.data.genres,
;

console.log(state);

选项 2

这是使用Object Destructuring 的另一种方法。解构允许我们从对象属性名称创建变量,根据需要重命名,并在属性未定义的情况下定义默认值。为了使用它,我们将 response.data 解构为我们想要的 5 个属性:

name 重命名为title 保持summarysummaryrating.average 重命名为ratingimage.medium重命名为medium,默认值为nullgenres 重命名为genre

然后我们需要将这些新常量传递给状态对象。

我提供了 2 个示例来展示它如何处理带有和不带有图像的响应。首先是带有 image 属性的响应。

示例 1

const response = 
  data: 
    name: "My Name",
    summary: "My Summary",
    rating: 
      average: "My Average"
    ,
    image: 
      medium: "My image"
    ,
    genres: "My genres"
  
;

const 
  name: title,
  summary,
  rating: average: rating,
  image: medium: image = medium: null,
  genres: genre
 = response.data;

const newState = 
  title,
  summary,
  rating,
  image, 
  genre


console.log(newState);

示例 2

现在是没有image 属性的响应。

const response = 
  data: 
    name: "My Name",
    summary: "My Summary",
    rating: 
      average: "My Average"
    ,
    genres: "My genres"
  


const 
  name: title,
  summary,
  rating: average: rating,
  image: medium: image = medium: null,
  genres: genre
 = response.data;

const newState = 
  title,
  summary,
  rating,
  image,
  genre


console.log(newState);

【讨论】:

【参考方案2】:

你可以在axios的回调中做if/else。

我愿意:

image: response.data.image != null ? response.data.image.medium: '' ,

或者使用 if/else:

let imageMedium = '';
if (response.data.image != null) 
   imageMedium = response.data.image.meduim

【讨论】:

以上是关于如果不满足条件,我可以为 Axios Get Method 编写 if/else 语句吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果不满足条件,则停止前进到下一页

循环用户输入直到满足条件

vuejs 应用程序中异步 axios 调用的多个响应的竞争条件

PlayFramework 1.4 在条件不满足后防止传播

如何正确等待这个 axios.get 请求?

如果条件不满足,派生列表达式SSIS如何忽略表达式?