Sobes.tech
Junior

Kaip galima apdoroti pažado klaidą (atmetimą) naudojant await?

sobes.tech AI

Atsakymas iš AI

Naudojant await su pažadu, klaidos (reject) gali būti apdorotos keliais būdais:

  1. try...catch konstrukcija: dažniausiai naudojamas ir rekomenduojamas būdas. Leidžia elegantiškai sugauti klaidą, kuri išmetama vykdant (resolve) arba atmetant (reject) pažadą.

    async function fetchData() {
      try {
        const response = await fetch('https://api.example.com/data');
        if (!response.ok) {
          throw new Error(`HTTP klaida! Statusas: ${response.status}`);
        }
        const data = await response.json();
        console.log(data);
      } catch (error) {
        console.error('Klaida gaunant duomenis:', error);
        // Papildomas klaidos apdorojimas arba naudotojo įspėjimas
      }
    }
    
    fetchData();
    
  2. .catch() metodas po await: mažiau pageidaujamas, bet galimas būdas. Klaida bus apdorota .catch() kaskadoje, jei pažadas bus atmestas.

    async function fetchData() {
      const response = await fetch('https://api.example.com/data')
        .catch(error => {
          console.error('Klaida vykdant fetch:', error);
          // fetch klaidos apdorojimas
          throw error; // Permetame klaidą tolesniam apdorojimui, jei reikia
        });
    
      if (response && !response.ok) {
           console.error(`HTTP klaida! Statusas: ${response.status}`);
           // HTTP klaidos apdorojimas
      }
    
      if (response && response.ok) {
          const data = await response.json()
              .catch(error => {
                  console.error('Klaida apdorojant JSON:', error);
                  // JSON apdorojimo klaidos apdorojimas
              });
          if (data) {
              console.log(data);
          }
      }
    }
    
    fetchData();
    

    Šis požiūris gali tapti nepatogus, kai yra daug potencialių klaidų taškų apdorojimui.

  3. Klaidos grąžinimo būdas: kai kurios bibliotekos arba savos funkcijos gali grąžinti porą [duomenys, klaida] vietoje pažado atmetimo.

    async function safelyFetchData() {
       const [data, error] = await safePromise(fetch('https://api.example.com/data'));
       if (error) {
          console.error('Bendra klaida gaunant duomenis:', error);
          return null; // arba kita reikšmė, rodanti klaidą
       }
       // Tikimasi, kad safePromise taip pat tvarko response.ok
       console.log(data);
       return data;
    }
    
    // Pavyzdys, kaip įgyvendinti safePromise (paprastas)
    async function safePromise(promise) {
        try {
            const result = await promise;
             // Čia gali būti patikra result.ok fetch atveju
             if (result && result.ok !== undefined && !result.ok) {
                 throw new Error(`HTTP klaida! Statusas: ${result.status}`);
             }
            // fetch atveju, galbūt reikės await result.json()
            if (result && typeof result.json === 'function') {
                const jsonData = await result.json();
                return [jsonData, null];
            }
            return [result, null];
        } catch (error) {
            return [null, error];
        }
    }
    
    safelyFetchData();
    

    Šis modelis (dažnai vadinamas "error-first callback" arba "go-style error handling") patogus, kai reikia apdoroti klaidas vietoje, nesustabdant funkcijos vykdymo.

Geriausias ir skaitomiausias būdas yra naudoti try...catch aplink await turintį kodo bloką.