Sobes.tech
Junior

Await bilanida va'da xatosini (rad etishni) qanday boshqarish mumkin?

sobes.tech AI

AIdan javob

await bilanmasi bilan va'da bilan ishlashda, xatoliklar (rad etishlar) bir nechta usullar bilan boshqarilishi mumkin:

  1. try...catch tuzilmasi: Eng keng tarqalgan va tavsiya etilgan usul. Bu, va'da (promise) yechilgan (resolve) yoki rad etilgan (reject) paytda xatoliklarni elegant tarzda ushlash imkonini beradi.

    async function fetchData() {
      try {
        const response = await fetch('https://api.example.com/data');
        if (!response.ok) {
          throw new Error(`HTTP xato! holat: ${response.status}`);
        }
        const data = await response.json();
        console.log(data);
      } catch (error) {
        console.error('Ma`lumotlarni olishda xato:', error);
        // Qo`shimcha xato bilan ishlash yoki foydalanuvchiga bildirish
      }
    }
    
    fetchData();
    
  2. awaitdan keyin .catch() usuli: Kamroq tavsiya etilgan, ammo mumkin. Xato, agar va'da rad etilgan bolsa, .catch()` callbackida boshqariladi.

    async function fetchData() {
      const response = await fetch('https://api.example.com/data')
        .catch(error => {
          console.error('Fetch qilishda xato:', error);
          // fetch xatosini boshqarish
          throw error; // Keyingi ishlov berish uchun xatoni qayta yuborish
        });
    
      if (response && !response.ok) {
           console.error(`HTTP xato! holat: ${response.status}`);
           // HTTP xatosini boshqarish
      }
    
      if (response && response.ok) {
          const data = await response.json()
              .catch(error => {
                  console.error('JSON ni tahlil qilishda xato:', error);
                  // JSON tahlil qilish xatosini boshqarish
              });
          if (data) {
              console.log(data);
          }
      }
    }
    
    fetchData();
    

    Bu yondashuv kop ehtimoliy xato nuqtalarini boshqarishda qiyinchilik tugdirishi mumkin.

  3. Xato bilan qiymatni qaytarish usuli: Bazi kutubxonalar yoki oz funksiyalaringiz, va'dani rad etish orniga, [malumotlar, xato] tuplagini qaytarishi mumkin.

    async function safelyFetchData() {
       const [data, error] = await safePromise(fetch('https://api.example.com/data'));
       if (error) {
          console.error('Umumiy xato:', error);
          return null; // yoki xatoni ko`rsatadigan boshqa qiymat
       }
       // safePromise response.ok xatolarini ham boshqaradi deb faraz qilamiz
       console.log(data);
       return data;
    }
    
    // safePromise ni misol uchun (soddalashtirilgan)
    async function safePromise(promise) {
        try {
            const result = await promise;
             // Bu yerda result.ok uchun tekshirish bo`lishi mumkin
             if (result && result.ok !== undefined && !result.ok) {
                 throw new Error(`HTTP xato! holat: ${result.status}`);
             }
            // fetch uchun, ehtimol, result.json() ni await qilish kerak
            if (result && typeof result.json === 'function') {
                const jsonData = await result.json();
                return [jsonData, null];
            }
            return [result, null];
        } catch (error) {
            return [null, error];
        }
    }
    
    safelyFetchData();
    

    Bu usul (kopincha "error-first callback" yoki "go-style error handling" deb ataladi) xatolarni lokal tarzda boshqarish uchun qulay, funksiyaning bajarilishini toxtatmasdan.

Eng toza va oqilishi oson usul, try...catchniawait ni oz ichiga olgan kod blokiga qo`yishdir.