react项目中如何解决同时需要多个请求问题

Posted 荷风伊夏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了react项目中如何解决同时需要多个请求问题相关的知识,希望对你有一定的参考价值。

 

 


 

在工作中,遇到一个需求,需要展示一个列表,第一次请求只有列表的名字,需要在知道名字的情况下,再去请求每个列表的详细信息,然后展示完整的列表信息。

经过一番研究,发现多重的请求写在页面的方法里比较好实现。其他的在effects和servers里都不太好实现。

首先我们在 componentDidMount这个生命周期里进行操作:

在dispatch请求后,在.then中获取上一个请求返回的数据。然后做逐一请求的动作。
componentDidMount() 
    const  dispatch  = this.props;
    dispatch(
      type: \'release/fetchAnnounce\',
      payload: 
        cluster:"guanwang"
      ,
    ).then((data)=>
      this.newResults(data)
    )
  ;
 

newResults方法 的书写:

Promise.all的讲解
 newResults=(data)=>
    const newData=[];
    data.map(item=>
      newData.push(...item)
    )
   // 异步操作,需要等待所有的请求接口完成以后,拿到全部的数据去使用
    const newResult=async ()=> 
      await Promise.all(
        newData.map((item, index) => 
          return   request(
            `/api/v1/admin/rule-set/list`
          ).then(r => 
            const val=
              
                id: index + 1,
                ...r.data[0],
                ...item
              ;
            return val
          )
        )
      ).then((values)=>
        this.setState(releaseVal:values)
      )
    
    newResult()
  ;

 

Promise.all的讲解

Promise.all在处理异步请求很有用。举个例子:

let q1 = new Promise((resolve, reject) => 
  resolve(\'处理成功了\')
)

let q2 = new Promise((resolve, reject) => 
  resolve(\'success\')
)

let q3 = Promse.reject(\'error\')

Promise.all([q1, q2]).then((res) => 
  console.log(res)               //[\'处理成功了\', \'success\']
).catch((error) => 
  console.log(error)
)

Promise.all([q1,q3,q2]).then((res) => 
  console.log(res)
).catch((error) => 
  console.log(error)      // 失败了,打出 \'error\'
)

 

它可以让你等待所有的操作完成后进行操作,而且它完成的返回结果是按 q1,q2,q3的顺序来的。不会因为p2的结果先出来就排在最前面。

知道Promise.all,就相对于的可以了解一下Promise.race

Promise.race的使用方法和Promise.all差不多。唯一的不同就是返回的顺序不同,Promise.race是按照运行的先后顺序进行排列的。假如q2先完成,q2的返回就会排在最前面。

 

以上是关于react项目中如何解决同时需要多个请求问题的主要内容,如果未能解决你的问题,请参考以下文章

React,如何在 axios 请求的对象中对数组进行包含

React - 多个 Axios 请求

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

如何在 React 应用程序上代理 Rsocket 请求

多线程时间片问题

如何使用 react-redux 存储令牌并在多个 axios 请求中使用它?