分页接口中,一次加载所有数据逻辑实现
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)
;
}
})
;
})
}