Как оптимизировать загрузку изображений в карточках, которые видны во viewport? Как решить проблему race condition при быстром переключении контента (например, YouTube Shorts)?
Answer from AI
sobes.tech AI
Для оптимизации загрузки изображений в карточках, видимых во viewport, стоит использовать ленивую загрузку (lazy loading) с помощью Intersection Observer API. Это позволяет загружать изображения только тогда, когда они появляются в зоне видимости пользователя, экономя трафик и ускоряя рендер.
Чтобы решить проблему race condition при быстром переключении контента (например, в YouTube Shorts), нужно контролировать асинхронные операции загрузки. Один из подходов — использовать уникальные идентификаторы для каждой загрузки и отменять или игнорировать результаты предыдущих запросов, если пользователь переключился на другой контент.
Пример на JavaScript:
let currentLoadId = 0;
function loadImage(url) {
const loadId = ++currentLoadId;
return new Promise((resolve, reject) => {
const img = new Image();
img.onload = () => {
if (loadId === currentLoadId) {
resolve(img);
} else {
// Игнорируем, так как это устаревшая загрузка
reject('Cancelled');
}
};
img.onerror = reject;
img.src = url;
});
}
// Использование:
loadImage('url1').then(img => {
// Отобразить изображение, если это актуально
}).catch(() => {});
// При быстром переключении loadImage вызовется снова, и предыдущий результат будет игнорирован
Такой подход предотвращает отображение устаревших изображений и улучшает UX при быстром переключении контента.