分页接口中,一次加载所有数据逻辑实现

2018-08-06  本文已影响24人  TOPro

一次加载所有分页数据的实现

/**
 * 一次请求所有分页数据
 * @param rows  每页请求多少
 * @param requestPageFunction 请求的执行者
 *          规范,注意要返回promise
 *          function(page,size){
 *              let params = { page, size }
 *              return axios("path/to","get",{params})
 *                  .then(resp=>{
 *                      return {
 *                          rows:resp.data,
 *                          totalCount:resp.total
 *                      }
 *                  })
 *              ;
 *          })
 * @param startPage 开始页,默认1
 * @returns {Promise<any>}
 */
export default (rows=10,requestPageFunction,startPage=1)=>{
    return new Promise((resolve,reject)=>{
        requestPageFunction(startPage,rows)
            .then(resp=>{
                if(resp.totalCount<=rows){
                    resolve(resp.rows);
                }else{
                    let _total = ~~((resp.totalCount - 1)/rows) + 1;
                    let _pageList = new Array(_total - 1).fill(1).map((v,index)=>index+1+startPage);
                    Promise.all(_pageList.map(page=>requestPageFunction(page,rows)))
                        .then(respList=>{
                            let ret = resp.rows;
                            respList.forEach(_resp=>{
                                if(_resp.status) reject(_resp);
                                Array.prototype.push.apply(ret,_resp.rows)
                            });
                            resolve(ret);
                        })
                        .catch(reject)
                    ;
                }
            })
        ;
    })
}
上一篇下一篇

猜你喜欢

热点阅读