首页 > 其他分享 >记一次面试被面试官问的问题(惨败)

记一次面试被面试官问的问题(惨败)

时间:2024-12-07 21:22:23浏览次数:8  
标签:面试官 缓存 浏览器 请求 requestKey 面试 pendingRequests config 惨败

一、http中的强缓存和协商缓存分别是什么,有什么区别?

答:这个问题没有想到会问,以为前端不会问道这些网络相关的问题。网上搜到的总结一下;先解释缓存是什么,再逐一回答;

浏览器缓存(Brower Caching)是浏览器对之前请求过的文件进行缓存,以便下一次访问时重复使用,节省带宽,提高访问速度,降低服务器压力
http缓存机制主要在http响应头中设定,响应头中相关字段为Expires、Cache-Control、Last-Modified、Etag。
简而言之,就是告诉浏览器在约定的这个时间前,可以直接从缓存中获取资源(representations),而无需跑到服务器去获取。

强缓存

‌强缓存‌是指浏览器在访问某个资源时,直接从本地缓存中读取数据,而不需要向服务器发送请求。强缓存的实现主要依赖于HTTP响应头中的Cache-ControlExpires字段。

  • ‌Cache-Control‌:通过设置Cache-Control响应头,服务器可以指定缓存的行为和策略。常见的指令包括max-age(指定缓存时间)、no-cache(不使用强缓存,但仍会使用协商缓存)、no-store(不使用缓存)等。例如,Cache-Control: max-age=31536000表示资源在一年内有效,浏览器可以直接使用缓存‌。
  • ‌Expires‌:这是HTTP 1.0规范中的字段,用于指定资源的过期时间。当浏览器发起请求时,如果本地缓存未过期,浏览器将直接使用缓存副本,而无需再次请求服务器‌。

协商缓存

‌协商缓存‌是指浏览器在访问资源时,首先向服务器发送请求,服务器根据请求中的某些标识(如Last-ModifiedETag)来判断资源是否发生变化。如果资源未变化,服务器返回304状态码,浏览器继续使用本地缓存;如果资源有更新,服务器返回最新的资源数据。

  • ‌Last-Modified‌:服务器在响应头中返回资源的最后修改时间。当浏览器再次请求资源时,通过If-Modified-Since请求头将上次的最后修改时间发送给服务器。如果资源的最后修改时间与服务器上的相同,服务器返回304状态码‌23。
  • ‌ETag‌:这是一个更精确的版本控制标识,通常是一个哈希值。当资源变化时,ETag也会变化。服务器通过If-None-Match请求头发送ETag给服务器,如果ETag未变化,服务器返回304状态码‌

应用场景

强缓存适用于内容变动不频繁的资源,如图片、CSS和JavaScript文件等;协商缓存适用于内容变动频繁的资源,如新闻文章、产品详情页等

二、怎么处理同一个接口在重复请求之后(比如三次),才拿到了对应的结果,怎么解决多次请求的问题?

答:这个面试问题也没有想到。。

 

  • 首先,创建一个对象来存储正在进行的请求。可以使用Map数据结构,其中键是请求的唯一标识(例如请求的 URL 和参数等组合成的字符串),值是对应的CancelToken(用于取消请求)。
  • 在请求拦截器中,对于每个请求,检查是否已经存在相同的请求正在进行中。

 

 

 1   const pendingRequests = new Map();
 2   import axios from 'axios';
 3    axios.interceptors.request.use((config) => {
 4        const requestKey = config.url + JSON.stringify(config.params);
 5        if (pendingRequests.has(requestKey)) {
 6            // 如果请求已经存在,取消当前请求
 7            const cancelToken = pendingRequests.get(requestKey);
 8            cancelToken.cancel('重复请求已取消');
 9        } else {
10            // 创建一个新的CancelToken
11            const source = axios.CancelToken.source();
12            config.cancelToken = source.token;
13            // 将请求添加到正在进行的请求列表中
14            pendingRequests.set(requestKey, source);
15        }
16        return config;
17    }, error => {
18        return Promise.reject(error);
19    });

 

  • 在响应拦截器中,当请求完成后,需要从pendingRequests对象中移除对应的请求。

 

 1  axios.interceptors.response.use((response) => {
 2        const requestKey = response.config.url + 
 3    JSON.stringify(response.config.params);
 4        if (pendingRequests.has(requestKey)) {
 5            // 请求完成,从正在进行的请求列表中移除
 6            pendingRequests.delete(requestKey);
 7        }
 8        return response;
 9    }, error => {
10        const requestKey = error.config.url + JSON.stringify(error.config.params);
11        if (pendingRequests.has(requestKey)) {
12            // 请求出错,从正在进行的请求列表中移除
13            pendingRequests.delete(requestKey);
14        }
15        return Promise.reject(error);
16    });

 

 上面这种方法时通过识别判断url 是否重复,然后使用axios.CancelToken 取消掉相同的请求。

  还有别的方法比如记录存储请求时的key ,再发送新请求时判断是否相同的key在处理, 然后取消请求或者选择等待; 在响应拦截的时候删除掉那个key

 

标签:面试官,缓存,浏览器,请求,requestKey,面试,pendingRequests,config,惨败
From: https://www.cnblogs.com/ssdtor/p/18592680

相关文章

  • 腾讯技术岗位笔试&面试题(一)
    说在前面本篇文章是腾讯技术面试题目汇总第一篇。后续将持续推出互联网大厂,如阿里,腾讯,百度,美团,头条等技术面试题目,以及答案和分析。欢迎大家点赞关注转发。1.map插入方式有几种?用insert函数插入pair数据,mapStudent.insert(pair<int,string>(1,“student_one”));用inser......
  • 你前面一位面试者是清华的,为什么我要录取你。。。
    最近看到一个挺有意思的面试问题,面试官问应聘者:“你前面那位面试者是清华毕业的,为什么我要录取你而不是他?”这种问题听着有点挑衅意味,面试者也差点失控了。不过,我觉得这其实是个考察应聘者情绪管理和临场反应能力的好问题。要说面对这种问题,保持冷静、理智地回应,真的是挺重......
  • Java春招大厂面试题
    文章目录软件开发2024春招大厂面试题1.redis的跳表是怎么实现的?2.MVCC实现原理3.Redis怎么实现延时消息4.http默认端口号是多少5.http的几种请求(get、post…)有什么区别1.GET2.POST6.Http和Https的区别7.tcp协议中,三次握手四次挥手是怎样的1.什么是三次握手2.......
  • 大模型,多模态大模型面试问题【代码题,DDPM,损失函数,激活函数,3DGS,Nerf,SH】
    大模型,多模态大模型面试问题【代码题,DDPM,损失函数,激活函数,3DGS,Nerf,SH】代码题:1.区间最小数乘区间最大和的最大值算法:2.二叉树中的最大路径和问题一:DDPM加噪公式为什么是根号形式,时间步T为啥这么大,通常是1000。加噪公式的根号形式时间步......
  • 面试题:JavaScript+ES5+
    jsthis指向看函数的调用方式,而不是他的定义时候分类构造函数==>new时候创建的对象对象的方法内部==》调用方法的对象事件处理函数==》绑定的事件箭头函数==》没有自己的this其他函数(全局的/局部的)==》匿名的就是window定时器函数==》window立即执行函数==》w......
  • 面试考题:定时器底层逻辑
    前言让我们回想一下关于定时器的内容,我们只知道,他是在我们设置的时间后才异步执行的程序。可在面试时回答这个就够了吗?那当然是不够的。本文将带你深入了解定时器底层定义我们先了解什么是定时器。在JavaScript中,定时器是一种用于延迟执行代码或定期执行代码的机制。它......
  • 关于redis的面试题
    目录一:redis的基础知识二:Redis协议与异步方式三:Redis的存储原理和数据模型四:Redis的持久化和高可用性一:redis的基础知识1:redis是一个内存数据库,KV数据库。2:包含的数据结构:string,list,hash,set,zset,其中string是一个安全的二进制字符串,我们可以在这个字符串的末尾添加'\0......
  • Java 2025年面试总结(持续更新)
    1.自我介绍简单一点吧,把自己的情况说清楚,一两分钟即可。2.微服务的组件答:微服务是把一个类似单体项目根据某种维度进行拆分,比如根据功能模块进行拆分。拆分之后,具备了更好的抗压性/扩展性,还可以更好的解耦,但是维护相比之前会更麻烦了常用的组件有SpringCloud。其中里面......
  • 已入职华为大模型算法岗,面试真的很水的…
    觉得中大厂面试太难的,完全就是自己没准备充分,技术不到位,没准备的面试完全是浪费时间,更是对自己的不负责!今天我给大家分享一下我整理的大模型面试专题和答案,其中大部分都是面试常问的面试题,可以对照这查漏补缺奥!祝大家早日上岸呀!方向:大模型算法工程师整个面试持续了1小......
  • 面试官:如何在 JavaScript 中选择最合适的函数定义方式?
    在最近的一个Chrome插件项目中,我深入探索了JavaScript中不同的函数定义方式。随着开发的深入,我发现理解这些方式的优劣势至关重要。比如,当我使用函数声明和箭头函数时,遇到了一些作用域和this指向的问题,这让我很困惑。此外,我还注意到,立即执行函数在某些情况下能够避免全局污......