Sobes.tech
Junior

Await kullanırken bir promise'in hatasını (reject) nasıl işleyebilirsiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

await ile bir söz verme (promise) kullanırken, hatalar (reddetmeler) birkaç şekilde işlenebilir:

  1. try...catch yapısı: En yaygın ve önerilen yöntemdir. Söz verme (promise) çözülürken (resolve) veya reddedilirken (reject) atılan hataları zarifçe yakalamayı sağlar.

    async function fetchData() {
      try {
        const response = await fetch('https://api.example.com/data');
        if (!response.ok) {
          throw new Error(`HTTP hata! durum: ${response.status}`);
        }
        const data = await response.json();
        console.log(data);
      } catch (error) {
        console.error('Veri alınırken hata:', error);
        // Ek hata işleme veya kullanıcıya bildirim
      }
    }
    
    fetchData();
    
  2. await sonrası .catch() yöntemi: Daha az tercih edilen, ancak mümkün. Hata, söz verme reddedildiğinde .catch() geri çağırma fonksiyonunda işlenir.

    async function fetchData() {
      const response = await fetch('https://api.example.com/data')
        .catch(error => {
          console.error('Fetch sırasında hata:', error);
          // fetch hatasını işleme
          throw error; // Daha fazla işlem için hatayı yeniden fırlat
        });
    
      if (response && !response.ok) {
           console.error(`HTTP hata! durum: ${response.status}`);
           // HTTP hatası işleme
      }
    
      if (response && response.ok) {
          const data = await response.json()
              .catch(error => {
                  console.error('JSON ayrıştırma hatası:', error);
                  // JSON ayrıştırma hatasını işleme
              });
          if (data) {
              console.log(data);
          }
      }
    }
    
    fetchData();
    

    Bu yaklaşım, olası hata noktalarının çokluğu nedeniyle karmaşık hale gelebilir.

  3. Hata ile dönüş değeri kullanımı: Bazı kütüphaneler veya kendi fonksiyonlarınız, söz verme reddetmek yerine [veriler, hata] şeklinde bir ikili dönebilir.

    async function safelyFetchData() {
       const [data, error] = await safePromise(fetch('https://api.example.com/data'));
       if (error) {
          console.error('Genel hata:', error);
          return null; // veya hata olduğunu belirten başka bir değer
       }
       // safePromise'un response.ok hatalarını da işlediği varsayılır
       console.log(data);
       return data;
    }
    
    // safePromise örneği (basitleştirilmiş)
    async function safePromise(promise) {
        try {
            const result = await promise;
             // Burada result.ok kontrolü yapılabilir
             if (result && result.ok !== undefined && !result.ok) {
                 throw new Error(`HTTP hata! durum: ${result.status}`);
             }
            // fetch için, result.json() await edilmesi gerekebilir
            if (result && typeof result.json === 'function') {
                const jsonData = await result.json();
                return [jsonData, null];
            }
            return [result, null];
        } catch (error) {
            return [null, error];
        }
    }
    
    safelyFetchData();
    

    Bu desen (sıkça "error-first callback" veya "Go tarzı hata yönetimi" olarak adlandırılır), hataları yerel olarak işlemek ve fonksiyonun yürütülmesini kesintiye uğratmamak istediğinizde kullanışlıdır.

En temiz ve okunabilir yöntem, try...catch kullanmak ve await içeren kod bloğunu çevrelemektir.