【每日一题】请实现一个 cacheRequest 方法

前端印记

共 4074字,需浏览 9分钟

 ·

2021-08-28 13:03

人生苦短,总需要一点仪式感。比如学前端~

请实现一个 cacheRequest 方法,保证发出多次同一个 ajax 请求时都能拿到的数据,而实际上只发出一次请求。

我的思路:

/* 准备一个缓存map,key为请求条件,值为第一次请求的响应结果。后续请求条件相同,直接返回map内的对应结果,不再发起请求。
cacheRequestMap = {
  'get-api/request_api/01': {
    request: {},
    response: data
  }
} */


import axios from 'axios';
let cacheRequestMap = {}
function cacheRequest({
  url,
  type,
  params
}
{
  let key = type + url
  return new Promise((res, rej) => {
    if(cacheRequestMap[key]) {
      res(cacheRequestMap[key].response)
    } else {
      axios[type]({
        url,
        params
      })
      .then((data) => {
        cacheRequestMap[key].response = data
        res(data)
      })
      .catch((err) => {
        rej(err)
      })
    }
  })
}
// 调用方式
cacheRequest({
  url'/request_api/01',
  type'get',
  params''
})
.then((data) => {

})
.catch((err) => {

})

参考答案

const request = (url, option) =>
  new Promise((res) => {
    setTimeout(() => {
      res({ data: option });
    }, 2000);
  });
const cache = new Map();
const cacheRequest = (url, option) => {
  let key = `${url}:${option.method}`;
  if (cache.has(key)) {
    if (cache.get(key).status === "pending") {
      return cache.get(key).myWait;
    }
    return Promise.resolve(cache.get(key).data);
  } else {
    // 无缓存,发起真实请求
    let requestApi = request(url, option);
    cache.set(key, { status"pending"myWait: requestApi });
    return requestApi
      .then((res) => {
        // console.log(cache)
        cache.set(key, { status"success"data: res });
        // console.log(cache)
        return Promise.resolve(res);
      })
      .catch((err) => {
        cache.set(key, { status"fail"data: err });
        Promise.reject(err);
      });
  }
};

实现原理

  • cache 构建 Map,用作缓存数据,把 URL 作为 key,用来判断是否来自同一个请求

  • 请求的更多参数可传入 option,例如 get,data…

  • 每次请求检查缓存,有的话就返回缓存,没有的话发起请求

  • 请求成功后,保存数据到 cache 并返回,失败则弹框提示

  • 特殊情况,如果请求在 pending 状态,则返回该请求继续等待

  • 代码中 ajax 请求用 setTimeout()函数代替,可自行封装 request 函数


END
愿你历尽千帆,归来仍是少年。


让我们一起携手同走前端路!

● 工作中常见页面布局的n种实现方法

● 三栏响应式布局(左右固宽中间自适应)的5种方法

● 两栏自适应布局的n种实现方法汇总

● 工作中常见的两栏布局案例及分析

● 垂直居中布局的一百种实现方式

● 常用九宫格布局的几大方法汇总

● 为什么操作DOM会影响WEB应用的性能?

● 移动端滚动穿透的6种解决方案

● Vue + TypeScript 踩坑总结




浏览 46
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报