React JS 从多个 API 函数中获取数据

Posted

技术标签:

【中文标题】React JS 从多个 API 函数中获取数据【英文标题】:React JS fetch data from multiple API function 【发布时间】:2021-05-24 07:23:27 【问题描述】:

我的任务是为 poc 创建一个前端。我不是前端开发人员,但我选择使用 React JS。 只有一个页面从多个 API 端点获取数据。 API 端点返回一个简单的 json 对象。 我设法让它工作,但是我的代码很难看,我想创建一个函数来处理所有这些,但我似乎无法做到正确。这是我的代码

export default class Dashboard extends React.Component 

constructor(props) 
    super(props);
    this.state = 
      group1: [],
      group2: [],
      group3: [],
      isLoaded: false,
    
  

componentDidMount() 
    const group1_url = "http://localhost/api/1"
    const group2_url = "http://localhost/api/2"
    const group3_url = "http://localhost/api/3"

    fetch(group1_url)
      .then(res => res.json())
      .then(json => 
        this.setState(
          group1: json,
        )
      );
    fetch(group2_url)
      .then(res => res.json())
      .then(json => 
        this.setState(
          group2: json,
        )
      );
    fetch(group3_url)
      .then(res => res.json())
      .then(json => 
        this.setState(
          group3: json,
        )
      );
  

我正在尝试创建这样的函数:

 function fetch_data(url, state) 
    fetch(url)
      .then(res => res.json())
      .then(json => 
        this.setState(
          state: json,
        )
      );
  

var group1 = fetch_data(group1_url, group1);

到目前为止还没有快乐。如何创建一个函数来获取数据并在 js 中设置状态? 或者,我怎样才能让我的代码看起来更好?或者还有什么我应该使用/研究的东西吗?

【问题讨论】:

【参考方案1】:

传递一个字符串作为第二个参数,并使用计算属性:

function fetch_data(url, state) 
    fetch(url)
      .then(res => res.json())
      .then(json => 
        this.setState(
          [state]: json,
        )
      );
  

fetch_data(group1_url, 'group1');

我还强烈建议捕获错误 - 应尽可能避免可能的未处理拒绝。

您可能希望使用Promise.all 等待所有组加载:

const dataSources = 
    group1: 'http://localhost/api/1',
    group2: 'http://localhost/api/2',
    group3: 'http://localhost/api/3',
;
Promise.all(
    Object.entries(dataSources).map(([propertyName, url]) => (
        fetch(url)
            .then(res => res.json())
            .then((result) => 
                this.setState(
                    [propertyName]: result
                )
            )
    ))
)
    .then(() => 
        this.setState( isLoaded: true )
    )
    .catch((error) => 
        // handle errors
    )

(另请注意your json argument is not a JSON - JSON 只是一种与 strings 一起存在的格式。已经反序列化的东西只是一个普通的对象或数组。最好把它称为不那么误导的东西,比如result 和我一样)

【讨论】:

非常感谢,我在我的代码中使用了您的实现,它立即生效。现在干净多了。我也添加了错误处理。【参考方案2】:

你可以试试Promise.all

Promise.all 接受一个 Promise 数组(从技术上讲,它可以是任何可迭代的,但通常是一个数组)并返回一个新的 Promise。

const points = [
    "http://localhost/api/1",
    "http://localhost/api/2",
    "http://localhost/api/3",
];

const responses = await Promise.all(points.map((point) => fetch(point)));
const data = await Promise.all(responses.map((response) => response.json()));
const [group1, group2, group3] = data;

this.setState(
    group1,
    group2,
    group3,
);

请记住将此逻辑包装在 async 函数中

【讨论】:

【参考方案3】:

你可以这样做。

function fetch_data(url, state) 
fetch(url)
  .then(res => res.json())
  .then(json => 
    this.setState(
      [state]: json,
    )
  );


var group1 = fetch_data(group1_url, 'group1');

【讨论】:

以上是关于React JS 从多个 API 函数中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

在 React Js 中管理多个 HTTP 请求操作

使用 React JS 从 Spotify API 调用多个播放列表

如何在 React v16.6 的新 CONTEXT API 中获取多个静态上下文

map 函数没有在 react.js 中迭代状态对象(数组格式)

Axios在react js中获取请求时出错

如何在 React JS 中获取 API?