class DataFetcher {
async fetch(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`Network response was not ok: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('Error fetching data:', error);
throw error;
}
}
}
class UserFetcher extends DataFetcher {
constructor(token) {
super();
this.token = token;
}
async fetch(url) {
const headers = {
'Authorization': `Bearer ${this.token}`
};
try {
const response = await fetch(url, { headers });
if (!response.ok) {
if (response.status === 401) {
throw new Error('Authentication failed');
}
throw new Error(`Network response was not ok: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('Error fetching user data:', error);
throw error;
}
}
}
// 性能优化方案1:限制并发请求数量
const limitConcurrentRequests = (requests, maxConcurrent) => {
return new Promise((resolve, reject) => {
let completed = 0;
const results = [];
const executeRequest = (index) => {
requests[index]()
.then(data => {
results[index] = data;
completed++;
if (completed === requests.length) {
resolve(results);
} else {
for (let i = 0; i < requests.length; i++) {
if (!results[i] && (results.filter(result => result === undefined).length < maxConcurrent)) {
executeRequest(i);
break;
}
}
}
})
.catch(error => {
reject(error);
});
};
for (let i = 0; i < Math.min(maxConcurrent, requests.length); i++) {
executeRequest(i);
}
});
};
// 性能优化方案2:缓存数据
const cache = {};
const cachedFetch = async (url, fetcher) => {
if (cache[url]) {
return cache[url];
}
const data = await fetcher.fetch(url);
cache[url] = data;
return data;
};
性能瓶颈分析
- 并发请求过多:过多的并发请求可能会耗尽网络资源,导致每个请求的响应时间变长。
- 响应时间过长:服务器处理请求的时间过长或者网络延迟过高,会影响用户体验。
性能优化方案
- 限制并发请求数量:通过控制同时进行的请求数量,避免网络资源过度消耗。上述代码中的
limitConcurrentRequests
函数实现了此功能,它接收一个请求数组和最大并发数,按顺序执行请求并控制并发数量。
- 缓存数据:对于相同 URL 的请求,直接从缓存中获取数据,减少重复请求。上述代码中的
cachedFetch
函数实现了简单的缓存机制,它检查缓存中是否有对应 URL 的数据,如果有则直接返回,否则执行请求并缓存结果。