- 使用防抖(Debounce)或节流(Throttle):
- 防抖:延迟一定时间后执行操作,如果在延迟时间内再次触发,则重新计时。例如,用户多次点击按钮发起网络请求,防抖可以避免短时间内多次请求。
- 节流:在一定时间间隔内,只允许触发一次操作。
- 代码示例:
<script>
import { debounce } from 'lodash';
let isLoading = false;
const fetchData = async () => {
if (isLoading) return;
isLoading = true;
try {
const response = await fetch('your - api - url');
const data = await response.json();
// 处理数据
} catch (error) {
console.error('Error fetching data:', error);
} finally {
isLoading = false;
}
};
const debouncedFetch = debounce(fetchData, 300);
</script>
<button on:click={debouncedFetch}>Fetch Data</button>
- 使用Promise队列:
- 确保请求按顺序执行,避免竞争条件。可以使用一个数组来存储请求函数,然后依次执行这些函数。
- 代码示例:
<script>
const requests = [];
const addRequest = () => {
requests.push(() => fetch('your - api - url').then(response => response.json()));
};
const executeRequests = async () => {
for (const request of requests) {
const response = await request();
// 处理数据
}
};
</script>
<button on:click={addRequest}>Add Request</button>
<button on:click={executeRequests}>Execute Requests</button>
- 为每个请求添加唯一标识:
- 在请求时生成一个唯一标识,在响应处理时检查标识是否匹配当前请求,避免处理过时的响应。
- 代码示例:
<script>
let currentRequestId = 0;
const fetchData = async () => {
const requestId = ++currentRequestId;
try {
const response = await fetch('your - api - url');
const data = await response.json();
if (requestId === currentRequestId) {
// 处理数据
}
} catch (error) {
console.error('Error fetching data:', error);
}
};
</script>
<button on:click={fetchData}>Fetch Data</button>