在 React 中使用 setState 进行多次获取请求

IT技术 javascript reactjs promise fetch
2021-05-03 08:12:54

我正在编写一个组件,它将向站点的两个不同路径发出获取请求,然后将其状态设置为结果响应数据。我的代码看起来像这样:

export default class TestBeta extends React.Component {
    constructor(props){
        super(props);
        this.state = {
            recentInfo: [],
            allTimeInfo: []
        };
    }

    componentDidMount(){
        Promise.all([
            fetch('https://fcctop100.herokuapp.com/api/fccusers/top/recent'),
            fetch('https://fcctop100.herokuapp.com/api/fccusers/top/alltime')
        ])
        .then(([res1, res2]) => [res1.json(), res2.json()])
        .then(([data1, data2]) => this.setState({
            recentInfo: data1, 
            alltimeInfo: data2
        }));
    }

但是,当我去渲染我的两个状态时,我发现它们实际上仍然是空的,实际上并没有设置任何东西。我觉得我可能错误地使用了 Promises 或 fetch() API,或者误解了 setState 的工作原理,或者是多种情况的组合。我四处测试,发现在第一个 then() 之后,我的 data1 和 data2 出于某种原因仍然是 Promises,还没有成为实际的 JSON 对象。无论哪种方式,我都无法弄清楚这里发生了什么。任何帮助或解释将不胜感激

1个回答
export default class TestBeta extends React.Component {
    constructor(props){
        super(props);
        this.state = {
            recentInfo: [],
            allTimeInfo: []
        };
    }

    componentDidMount(){
        Promise.all([
            fetch('https://fcctop100.herokuapp.com/api/fccusers/top/recent'),
            fetch('https://fcctop100.herokuapp.com/api/fccusers/top/alltime')
        ])
        .then(([res1, res2]) => Promise.all([res1.json(), res2.json()]))
        .then(([data1, data2]) => this.setState({
            recentInfo: data1, 
            alltimeInfo: data2
        }));
    }

如果您在then处理程序中返回 Promise ,则将其解析为 value。如果您返回任何其他内容(例如您的示例中的 Array),它将按原样传递。所以你需要包装你的Promise数组Promise.all以使其成为 Promise 类型