后端一次性返还10条数据,要求前端分页....

6 阅读2分钟

虽然说天天看到各种面试题后端返还1w条数据的情况,我觉得会有这种场景吗,这次终于让我遇到了

因为需要把整段数据全部给计算好,分页返还相对麻烦,一次返还方便计算,于是乎分页任务就留给前端

解决思路

实际上解决方式根据不同场景有不同方案,如果我一个个页面去修改那么总共有100来个页面需要进行修改,那样耗时费力,于是乎在axios拦截器层面进行修改成为了最优解

1.初使思路

刚开始想着做一层缓存,第一次查询写入到map里面,后续查询在拦截器层面进行响应取消,后拿取map里面的数据返回出去

const service = axios.create({
 
  timeout: 10000,

})
const map = new Map()

// request拦截器
service.interceptors.request.use(
  (config) => {
  //添加拦截器
    const abort = new AbortController()
    config.signal = abort.signal
     if(针对想要缓存的接口判断){
      const cache =  map.get(存入的id)
       if(cache){
        abortController.abort()
        return cache
       }
         
     }
    return config
  },
  (error) => {
    console.log(error)
    Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (res) => {
 
     return res.data
    }
  },
  (error) => {
      if (针对想要缓存的接口判断) {
        map.set(`${res.config.method}-${res.config.url}`, res)
      }
    return Promise.reject(error)
  }
)

该方案确实能做到拦截请求与缓存数据,但拦截请求走的是response拦截器的err函数,这一点上并不符合需求

正确方式

在axios中有个adapter属性,这是自定义请求方式。总所周知,axios在浏览器上底层是基于xhr,node是http 具体代码是在axios库当中的./lib/adapters

这也意味着你可以自定义使用fetch发送请求以满足需求。

具体封装思路就变为查询到mao缓存就不发请求,查询不到就发起请求。那是否意味着我们需要在写一遍xhr呢?

不需要,axios有个axios.defaults.adapter,这就可直接发送请求,于是代码就是

const service = axios.create({
  timeout: 10000,
  adapter: customAdapter(axios.defaults.adapter),
})
const map = new Map()
function customAdapter(adapter) {
  return (config) => {
     const cache = map.get(`${config.method}-${config.url}`)
     if (判断走缓存) {
       console.log(config)
       console.log(cache)
       return Promise.resolve(cache)
     }
    //走请求
    return adapter(config)
  }
}

详情可查看./lib/adapters/README.md文档

这样既可满足需要