接口重复请求保留最后一个请求结果

此处一堆废话:目录锚点查看解决方法

今天发现一个历史功能查询的数据突然出现了错误
(因为请求接口代码后续操作是同步,加载了多条数据)。
排查问题原因是因为这个接口突然变的很慢,导致多次的情况下接口未及时返回
因:切换此功能中在切换筛选条件时也要触发查询,所以未加loading判定。

此方法更适合只有少数接口需要做优化的情况。更复杂情况建议使用:请求封装 + AbortController (fetch) 或 CancelToken (axios) 的方案。

解决方法

每次调用接口以时间戳作为id,请求结束后判断id是否一致

search() {
	const nowtime = new Date().getTime()
	// 示例代码是在 vue 中使用。
	// 其他开发环境注意此处 requestId 存放位置。
	this.requestId = nowTime

	getData()
		.then(res => {
			if (id !== this.requestId) return
			// TODO...
		})
}

闭包版 如果你使用上面代码不起作用可以更换此版本。

// 查询方法
search() {
	const nowtime = new Date().getTime()
	this.requestId = nowTime

	const fn = (id) => {
		getData()
			.then(res => {
				if (id !== this.requestId) return
			})
	}

	fn(nowTime)
}
代码中通过缓存 GET 请求数据避免重复请求相同接口的原理基于以下几个关键步骤: 1. **拦截响应**:利用 Axios 的响应拦截器 `instance.interceptors.response.use`,在响应返回时对其进行拦截处理。这使得在响应被传递给后续的 `then` 或 `catch` 方法之前,可以对响应数据进行额外的操作。 2. **筛选 GET 请求**:在拦截器的成功回调函数中,首先检查响应的请求方法是否为 `GET`。因为通常只有 `GET` 请求的数据是相对稳定、可缓存的,而 `POST`、`PUT`、`DELETE` 等请求往往会对资源进行修改,其结果不适合缓存。 3. **生成缓存键**:对于 `GET` 请求,根据请求的 URL 和参数生成一个唯一的缓存键。代码中使用 `response.config.url + JSON.stringify(response.config.params)` 作为缓存键,确保不同的请求(即使 URL 相同但参数不同)有不同的缓存键。 4. **存储缓存数据**:使用 `localStorage.set(cacheKey, response.data)` 将响应数据存储到本地存储中。本地存储是浏览器提供的一种持久化存储机制,可以在浏览器关闭后仍然保留数据。 5. **返回核心数据**:最后,返回 `response.data`,即响应的核心数据,使得后续的代码可以直接使用这些数据。 当再次发起相同的 `GET` 请求时,可以在请求拦截器中检查本地存储中是否存在对应的缓存数据。如果存在,则直接使用缓存数据,而不必再次向服务器发送请求,从而避免了重复请求相同接口,减少了网络流量和服务器负载。 以下是一个简单的示例代码,展示了如何在请求拦截器中检查缓存: ```javascript instance.interceptors.request.use( (config) => { if (config.method === 'get') { const cacheKey = config.url + JSON.stringify(config.params); const cachedData = localStorage.get(cacheKey); if (cachedData) { // 如果存在缓存数据,直接返回一个包含缓存数据的 Promise return Promise.resolve({ data: cachedData }); } } return config; }, (error) => { return Promise.reject(error); } ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值