• 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的返回就会排在最前面。

  • 相关阅读:
    09.移动先行之谁主沉浮----控件之轮流轰炸——高级控件
    08.移动先行之谁主沉浮----控件之轮流轰炸——常用控件
    备份和还原 第三篇:master 数据库的备份和还原
    备份和还原 第二篇:数据库还原
    备份和还原 第一篇:开始数据库备份
    分页实现:Offset-Fetch
    RowVersion 用法
    TSQL 分组集(Grouping Sets)
    MongoDB 存储引擎:WiredTiger和In-Memory
    MongoDB 安全和访问权限控制
  • 原文地址:https://www.cnblogs.com/class1/p/15776276.html
Copyright © 2020-2023  润新知