zoukankan      html  css  js  c++  java
  • 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的返回就会排在最前面。

  • 相关阅读:
    Ubuntu中Nginx的安装与配置
    在Ubuntu中安装Redis
    微博开放平台
    QQ互联 回调地址
    PostgreSQL在Ubuntu上安装指南
    postgresql常用命令
    在Linux下查看环境变量
    vue-04-组件
    vue-03-style与class
    vue-02-安装-指令
  • 原文地址:https://www.cnblogs.com/class1/p/15776276.html
Copyright © 2011-2022 走看看