实现 fetch 请求返回的统一拦截
拦截器的目的
拦截器(interceptors)一般用于发起 http 请求之前或之后对请求进行统一的处理,
如 token 实现的登录鉴权(每个请求带上 token),统一处理 404 响应等等。
之前的实现
区别于 axios,fetch 没有搜到请求返回拦截器相关 api,那之前是怎么实现统一拦截的呢,
参照 antd-pro,写一个统一的请求方法,所有的请求都调用这个方法,从而实现请求与返回的拦截。
这样我们每次都要去引入这个方法使用,那么有没有更好实现呢?
常见的一道面试题
vue 双向绑定的原理
- vue2 基于 defineProperty
- vue3 基于 Proxy
极简的双向绑定
const obj = {};
Object.defineProperty(obj, 'text', {
get: function() {
console.log('get val'); 
},
set: function(newVal) {
console.log('set val:' + newVal);
document.getElementById('input').value = newVal;
document.getElementById('span').innerHTML = newVal;
}
});
const input = document.getElementById('input');
input.addEventListener('keyup', function(e){
obj.text = e.target.value;
})
其中我们可以看到运用了看数据劫持。
defineProperty
查看 MDN
我们可以发现 defineProperty 的使用方法
Object.defineProperty(obj, prop, descriptor);
descriptor 属性与方法包含
- value
属性的值(不用多说了) - configurable: true,
总开关,一旦为 false,就不能再设置他的(value,writable,configurable) - enumerable: true,
是否能在 for...in 循环中遍历出来或在 Object.keys 中列举出来。 - writable: true,
如果为 false,属性的值就不能被重写,只能为只读了 - set()
设置属性时候会调用 - get()
访问属性时候会调用
回想下我们使用 fetch 的时候都是直接使用,所以 fetch 是 window 或者 global 对象下的一个属性啊,
每次我们使用 fetch 的时候相当于访问了 window 或者 global 的属性,也就是上面的 get 方法
拦截器的实现
const originFetch = fetch;
Object.defineProperty(window, "fetch", {
configurable: true,
enumerable: true,
// writable: true,
get() {
return (url,options) => {
return originFetch(url,{...options,...{
headers: {
'Content-Type': 'application/json;charset=UTF-8',
Accept: 'application/json',
token:localStorage.getItem('token')
//这里统一加token 实现请求拦截
},...options.headers
}}).then(checkStatus)
// checkStatus 这里可以做返回错误处理,实现返回拦截
.then(response =>response.json())
}
});
只要将上述代码贴到程序入口文件即可
扩展
此文是基于 defineProperty , Proxy 同样可以实现。
另外在小程序里面 request 方法是挂在 wx 下面,同样是可以实现,
具体实现 wx.request
前端学习
记录自己的前端学习历程
833 声望
46 粉丝
推荐阅读
上海招聘前端开发
【内推】前端开发工程师(3-5年)公司:上海亿锦网络科技职位描述资深Web前端工程师职位描述:负责参与项目的需求评审、开发以及技术攻坚。负责持续优化前端体验、页面响应速度等。负责前沿技术的预研、讨论并最终...
t现在是冬天t阅读 4
安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...
边城赞 31阅读 7.2k评论 5
涨姿势了,有意思的气泡 Loading 效果
今日,群友提问,如何实现这么一个 Loading 效果:这个确实有点意思,但是这是 CSS 能够完成的?没错,这个效果中的核心气泡效果,其实借助 CSS 中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们...
chokcoco赞 20阅读 2.1k评论 2
在前端使用 JS 进行分类汇总
最近遇到一些同学在问 JS 中进行数据统计的问题。虽然数据统计一般会在数据库中进行,但是后端遇到需要使用程序来进行统计的情况也非常多。.NET 就为了对内存数据和数据库数据进行统一地数据处理,发明了 LINQ (L...
边城赞 17阅读 1.9k
【已结束】SegmentFault 思否写作挑战赛!
SegmentFault 思否写作挑战赛 是思否社区新上线的系列社区活动在 2 月 8 日 正式面向社区所有用户开启;挑战赛中包含多个可供作者选择的热门技术方向,根据挑战难度分为多个等级,快来参与挑战,向更好的自己前进!
SegmentFault思否赞 20阅读 5.6k评论 10
过滤/筛选树节点
又是树,是我跟树杠上了吗?—— 不,是树的问题太多了!🔗 相关文章推荐:使用递归遍历并转换树形数据(以 TypeScript 为例)从列表生成树 (JavaScript/TypeScript) 过滤和筛选是一个意思,都是 filter。对于列表来...
边城赞 18阅读 7.7k评论 3
你可能不需要JS!CSS实现一个计时器
CSS现在可不仅仅只是改一个颜色这么简单,还可以做很多交互,比如做一个功能齐全的计时器?样式上并不复杂,主要是几个交互的地方数字时钟的变化开始、暂停操作重置操作如何仅使用 CSS 来实现这样的功能呢?一起...
XboxYan赞 21阅读 1.6k评论 1
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。