需求描述
快速点击查询按钮多次,只需要最后一次点击的查询结果,中断之前无效点击发起的 http 请求,以便优化页面性能,减少对流量的消耗。
效果预览
快速点击查询按钮多次,期间第2-8次点击的请求取消,最后一次点击(第9次)的请求成功。
完整代码
原理详见注释
<template>
<div>
<button @click="id++">查询</button>
</div>
</template>
<script setup lang="ts">
import axios from "axios";
import { ref, watchEffect } from "vue";
let id = ref(1);
watchEffect((onInvalidate) => {
// source相关的部分为axios中断请求的固定写法
const source = axios.CancelToken.source();
axios
.get(`https://jsonplaceholder.typicode.com/todos/${id.value}`, {
cancelToken: source.token,
})
.catch((err) => {
// 中断请求时会触发catch,其中message属性的值为下文中 source.cancel() 的参数
console.log(err.message);
});
onInvalidate(() => {
// 中断未完成的请求,此处 -1 是因为最后一个请求不会中断。
source.cancel(`已中断id为${id.value - 1}的查询`);
});
});
</script>