Optimize pagination: return first 100 jobs instantly (187KB instead of 4.3MB), load remaining pages in background
This commit is contained in:
@@ -401,23 +401,60 @@
|
||||
// Progress bar removed - jobs load instantly from cache
|
||||
|
||||
// --- Fetch all jobs ---
|
||||
let allJobsFetched = false;
|
||||
|
||||
async function fetchAllJobs(){
|
||||
clearJobsCache('Loading…');
|
||||
const startTime = performance.now();
|
||||
try {
|
||||
const url = `/api/jobs-all`;
|
||||
const res = await fetchNoCache(url);
|
||||
// First request: get initial 100 jobs
|
||||
const url = `/api/jobs-all?page=1&perPage=100`;
|
||||
const controller = new AbortController();
|
||||
const timeoutId = setTimeout(() => controller.abort(), 3000); // 3 second timeout
|
||||
|
||||
const res = await fetchNoCache(url, { signal: controller.signal });
|
||||
clearTimeout(timeoutId);
|
||||
if(!res.ok) throw new Error(`Fetch failed: ${res.status}`);
|
||||
|
||||
const data = await res.json();
|
||||
const items = data.items || [];
|
||||
jobsCache.length = 0;
|
||||
jobsCache.push(...items);
|
||||
applyFiltersAndRender();
|
||||
|
||||
const loadTime = Math.round(performance.now() - startTime);
|
||||
console.log(`✓ Loaded ${items.length} jobs in ${loadTime}ms`);
|
||||
console.log(`✓ Loaded ${items.length} jobs in ${loadTime}ms (page 1 of ${data.totalPages})`);
|
||||
|
||||
// If there are more pages, load them in background
|
||||
if (data.totalPages && data.totalPages > 1) {
|
||||
loadRemainingPages(data.totalPages, 2);
|
||||
} else {
|
||||
allJobsFetched = true;
|
||||
}
|
||||
} catch(err) {
|
||||
alert('Failed to fetch jobs: '+err.message);
|
||||
console.error(err);
|
||||
if(err.name === 'AbortError') {
|
||||
console.warn('Fetch timeout - server may be slow');
|
||||
} else {
|
||||
console.error('Fetch error:', err.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function loadRemainingPages(totalPages, startPage) {
|
||||
try {
|
||||
for (let page = startPage; page <= totalPages; page++) {
|
||||
const url = `/api/jobs-all?page=${page}&perPage=100`;
|
||||
const res = await fetchNoCache(url);
|
||||
if (!res.ok) break;
|
||||
const data = await res.json();
|
||||
const items = data.items || [];
|
||||
jobsCache.push(...items);
|
||||
applyFiltersAndRender();
|
||||
console.log(`✓ Loaded page ${page} of ${totalPages} (${items.length} more jobs)`);
|
||||
}
|
||||
allJobsFetched = true;
|
||||
} catch(err) {
|
||||
console.warn('Error loading remaining pages:', err.message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user