- Konu sahibi
- #1
API’den veri yüklenirken yükleniyor göstergesi eklemek için isteği başlatmadan önce göstergeyi görünür yapın, istek tamamlandığında ise başarılı veya hatalı sonuçtan bağımsız olarak gizleyin. Bunun için genellikle
Yükleniyor göstergesi yalnızca görsel bir ayrıntı değildir. Kullanıcıya isteğin başlatıldığını ve sayfanın yanıt beklediğini bildirir. Göstergeyi istek tamamlandıktan sonra açarsanız anlamını kaybeder; hata oluştuğunda gizlemezseniz de sayfa sürekli yükleniyormuş gibi görünür.
Uygulama sırası şöyledir:
Bu dosyayı bir
API HTTP düzeyinde başarılı bir yanıt verdiğinde
Başarılı yanıt alınması yalnızca isteğin sunucu tarafından kabul edildiğini gösterir. Dönen verinin beklediğiniz alanlara sahip olduğunu otomatik olarak kanıtlamaz. Örneğin kod
Ağ bağlantısı kesilirse, alan adı çözümlenemezse veya
Bu nedenle örnekte şu kontrol bulunur:
Bu kontrol olmadan 404 veya 500 yanıtının gövdesi işlenmeye çalışılabilir.
Her iki durumda da
Bu bölümün amacı yükleme göstergesini kapatmaktır. Yükleme göstergesini yalnızca başarılı sonuçta gizlemeyin. Hata durumunda da gizlenmezse kullanıcı işlemin hâlâ sürdüğünü sanabilir ve aynı işlemi tekrar tekrar başlatabilir.
Örnekte yükleme alanı başlangıçta
Bu yaklaşımda JavaScript görünüm ayrıntısını doğrudan belirlemek yerine yalnızca
Örnekteki adres varsayımsaldır. Kendi API adresinizi yazarken yalnızca URL’yi değiştirmek yeterli olmayabilir. API’nin istediği HTTP yöntemi, kimlik doğrulama başlıkları, istek gövdesi ve dönen JSON yapısı da kodla uyumlu olmalıdır.
kodun
Küçük bir sayfada tek bir API isteği varsa metin göstergesi yeterlidir. Kullanıcı düğmeye basarak işlem başlatıyorsa düğmeyi geçici olarak devre dışı bırakmak da yinelenen istekleri önler. Birden fazla veri alanı aynı anda yükleniyorsa sayfanın tamamını kaplayan gösterge yerine her bölümün kendi yükleme durumunu yönetmek daha doğru olabilir.
Tabloya göre seçim yaparken isteğin süresinden çok, kullanıcının hangi alanın beklediğini bilmesi önemlidir. Sayfanın tamamını kilitleyen bir gösterge yalnızca bütün içerik veri gelmeden anlamlı değilse kullanılmalıdır. Bağımsız kartlar veya paneller ayrı ayrı yükleniyorsa her birinin durumunu ayrı göstermek kullanıcıya daha doğru bilgi verir.
fetch() çağrısından önce bir yükleme alanını gösterir, try...catch...finally yapısında finally bloğunu kullanırsınız. Böylece ağ isteği sürerken kullanıcı bekleme durumunu görür; veri geldiğinde içerik, hata oluştuğunda ise açıklayıcı hata mesajı gösterilir.Yükleniyor göstergesinin temel çalışma sırası
Yükleniyor göstergesi yalnızca görsel bir ayrıntı değildir. Kullanıcıya isteğin başlatıldığını ve sayfanın yanıt beklediğini bildirir. Göstergeyi istek tamamlandıktan sonra açarsanız anlamını kaybeder; hata oluştuğunda gizlemezseniz de sayfa sürekli yükleniyormuş gibi görünür.
Uygulama sırası şöyledir:
- Yükleme alanını başlangıçta gizleyin.
- API isteği başlamadan hemen önce bu alanı görünür yapın.
- İstek başarılı olursa gelen veriyi sayfaya yazın.
- İstek başarısız olursa hata mesajı gösterin.
- İstek hangi sonuçla biterse bitsin yükleme alanını gizleyin.
HTML:
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>API veri yükleme göstergesi</title>
<style>
#loading {
display: none;
color: #555;
}
#error {
color: #b00020;
}
</style>
</head>
<body>
<button id="loadUsersButton">Kullanıcıları yükle</button>
<p id="loading" aria-live="polite">Veriler yükleniyor...</p>
<p id="error" role="alert"></p>
<ul id="userList"></ul>
<script>
const loadUsersButton = document.querySelector('#loadUsersButton');
const loading = document.querySelector('#loading');
const error = document.querySelector('#error');
const userList = document.querySelector('#userList');
async function loadUsers() {
loading.style.display = 'block';
error.textContent = '';
loadUsersButton.disabled = true;
try {
const response = await fetch('https://jsonplaceholder.typicode.com/users');
if (!response.ok) {
throw new Error(`İstek başarısız oldu: ${response.status}`);
}
const users = await response.json();
userList.innerHTML = users
.map(user => `<li>${user.name}</li>`)
.join('');
} catch (err) {
userList.innerHTML = '';
error.textContent = 'Veriler yüklenirken bir sorun oluştu.';
console.error(err);
} finally {
loading.style.display = 'none';
loadUsersButton.disabled = false;
}
}
loadUsersButton.addEventListener('click', loadUsers);
</script>
</body>
</html>
Bu dosyayı bir
.html dosyası olarak kaydedip tarayıcıda açtığınızda düğmeye basılmasıyla loadUsers() çalışır. Fonksiyon önce loading.style.display = 'block' ile yükleme mesajını gösterir. Düğmenin devre dışı bırakılması, kullanıcı isteği tamamlanmadan aynı düğmeye art arda basarak birden fazla istek göndermesini önler.Başarılı sonuçta ne olur?
API HTTP düzeyinde başarılı bir yanıt verdiğinde
response.ok değeri genellikle true olur. Kod daha sonra response.json() ile yanıt gövdesini JavaScript verisine dönüştürür ve kullanıcı adlarını listeye ekler. Bu aşamada yükleniyor mesajı henüz finally çalışmadığı için kısa süreliğine görünür kalabilir; işlem tamamlanınca gizlenir.Başarılı yanıt alınması yalnızca isteğin sunucu tarafından kabul edildiğini gösterir. Dönen verinin beklediğiniz alanlara sahip olduğunu otomatik olarak kanıtlamaz. Örneğin kod
name alanını beklerken API farklı bir alan adı döndürüyorsa istek başarılı görünür, ancak liste yanlış veya boş oluşturulabilir. Bu nedenle gerçek API kullanırken yanıtın biçimini de kontrol etmelisiniz.Hata oluştuğunda ne olur?
Ağ bağlantısı kesilirse, alan adı çözümlenemezse veya
fetch() çalışırken başka bir hata oluşursa işlem catch bloğuna geçer. HTTP 404 veya 500 gibi yanıtlar için ayrıca response.ok kontrolü gerekir; çünkü fetch(), sunucunun HTTP hata durumu döndürmesini her zaman JavaScript istisnası olarak değerlendirmez.Bu nedenle örnekte şu kontrol bulunur:
JavaScript:
if (!response.ok) {
throw new Error(`İstek başarısız oldu: ${response.status}`);
}
Bu kontrol olmadan 404 veya 500 yanıtının gövdesi işlenmeye çalışılabilir.
catch bloğunda kullanıcıya genel bir hata mesajı gösterilirken console.error(err) ile geliştirici konsoluna ayrıntı yazılır. Gerçek projede hata durumunu ayırmak isterseniz HTTP durum kodunu, ağ hatasını ve geçersiz JSON yanıtını farklı mesajlarla ele alabilirsiniz.Her iki durumda da
finally bloğu çalışır:
JavaScript:
finally {
loading.style.display = 'none';
loadUsersButton.disabled = false;
}
Bu bölümün amacı yükleme göstergesini kapatmaktır. Yükleme göstergesini yalnızca başarılı sonuçta gizlemeyin. Hata durumunda da gizlenmezse kullanıcı işlemin hâlâ sürdüğünü sanabilir ve aynı işlemi tekrar tekrar başlatabilir.
Göstergenin görünümünü CSS ile yönetme
Örnekte yükleme alanı başlangıçta
display: none ile gizlenmiştir. JavaScript isteği başlatırken bu değer block yapılır. Daha büyük uygulamalarda sınıf ekleyip çıkarmak daha okunaklı olabilir:
HTML:
<p id="loading" class="loading" aria-live="polite">Veriler yükleniyor...</p>
CSS:
.loading {
display: none;
}
.loading.is-visible {
display: block;
}
JavaScript:
loading.classList.add('is-visible');
try {
// API isteği
} finally {
loading.classList.remove('is-visible');
}
Bu yaklaşımda JavaScript görünüm ayrıntısını doğrudan belirlemek yerine yalnızca
is-visible sınıfını yönetir. Renk, animasyon veya dönen simge eklemek istediğinizde değişiklikleri CSS içinde tutabilirsiniz.Gerçek API’ye uyarlarken kontrol edilmesi gerekenler
Örnekteki adres varsayımsaldır. Kendi API adresinizi yazarken yalnızca URL’yi değiştirmek yeterli olmayabilir. API’nin istediği HTTP yöntemi, kimlik doğrulama başlıkları, istek gövdesi ve dönen JSON yapısı da kodla uyumlu olmalıdır.
- Yanıt verisi doğrudan dizi mi, yoksa
datagibi bir alanın içinde mi kontrol edin. - API kimlik doğrulama istiyorsa gereken
headersdeğerlerini ekleyin. - İstek
GETdışında bir yöntem kullanıyorsamethodve gerekiyorsabodydeğerini belirtin. - Tarayıcı konsolunda CORS hatası varsa sorunun yükleme göstergesiyle değil, sunucunun farklı bir alan adından gelen isteğe izin vermemesiyle ilgili olduğunu ayırın.
- Kullanıcı yeni bir istek başlatmadan önce eski isteğin hâlâ sürüp sürmediğini kontrol edin; gerektiğinde
AbortControllerile önceki isteği iptal edin.
JSON:
{
"data": [
{ "name": "Ayşe" },
{ "name": "Mehmet" }
]
}
kodun
const users = await response.json(); satırı yerine const { data: users } = await response.json(); kullanması gerekir. Aksi durumda HTTP isteği başarılı olsa bile users.map beklenen dizi üzerinde çalışmayabilir. Buradaki düzeltme, yükleme göstergesinin çalışması için değil, API yanıtının gerçek yapısına uygun veri işlemek için gereklidir.Yükleme göstergesi için uygun yaklaşımı seçme
Küçük bir sayfada tek bir API isteği varsa metin göstergesi yeterlidir. Kullanıcı düğmeye basarak işlem başlatıyorsa düğmeyi geçici olarak devre dışı bırakmak da yinelenen istekleri önler. Birden fazla veri alanı aynı anda yükleniyorsa sayfanın tamamını kaplayan gösterge yerine her bölümün kendi yükleme durumunu yönetmek daha doğru olabilir.
| Durum | Uygun gösterge | Dikkat edilmesi gereken |
|---|---|---|
| Tek isteğin beklenmesi | Metin veya dönen simge | İstek bitince başarı ve hata durumlarının ikisinde de gizlenmeli |
| Düğmeyle başlatılan işlem | Düğmeyi devre dışı bırakma ve yükleme metni | İstek tamamlanınca düğme yeniden etkinleştirilmeli |
| Sayfanın ilk yüklenmesi | İçerik alanında yer tutucu veya iskelet görünüm | Veri gelmeden boş içerik ile hata durumunu birbirine karıştırmamalı |
| Birden fazla bağımsız bölüm | Bölüm başına ayrı gösterge | Bir isteğin tamamlanması diğer bölümlerin durumunu gizlememeli |
Sık sorulan sorular
Yükleniyor göstergesi neden kaybolmuyor?
Genellikle hata durumunda gizleme kodu çalışmıyordur. Göstergeyi yalnızca başarılı
then bölümünde kapatmak yerine try...catch...finally yapısında finally bloğuna taşıyın. Ayrıca JavaScript dosyasının gerçekten yüklendiğini ve göstergenin seçicisinin doğru öğeyi bulduğunu kontrol edin.fetch() 404 döndürdüğünde neden catch çalışmıyor?
fetch() HTTP 404 veya 500 yanıtını çoğu durumda ağ hatası olarak görmez. Bu nedenle response.ok değerini kontrol edip başarısızsa kendiniz hata fırlatmalısınız. Ardından işlem catch bloğuna geçer ve finally göstergiyi kapatır.İstek sürerken kullanıcı düğmeye tekrar basarsa ne olur?
Düğme devre dışı bırakılmazsa birden fazla API isteği başlayabilir. Bu, aynı verinin birden çok kez yüklenmesine veya yanıtların beklenmeyen sırayla ekrana yazılmasına yol açabilir. İstek başlarken
button.disabled = true yapıp işlem sonunda finally içinde tekrar false değerine getirin.