Sobes.tech
Junior

Await колдонуп жатканда убададагы катаны ( четке кагуу) кантип иштетсе болот?

sobes.tech AI

AIден жооп

await менен убада колдонууда, каталар (reject) бир нече жол менен иштетилиши мүмкүн:

  1. try...catch структурасы: Эң кеңири колдонулган жана сунушталган ыкма. Бул убада чечилгенде (resolve) же четке кагылганда (reject) чыккан катаны элеганттуу түрдө кармайт.

    async function fetchData() {
      try {
        const response = await fetch('https://api.example.com/data');
        if (!response.ok) {
          throw new Error(`HTTP ката! стат: ${response.status}`);
        }
        const data = await response.json();
        console.log(data);
      } catch (error) {
        console.error('Маалымат алуу учурунда ката:', error);
        // Кошумча катаны иштетүү же колдонуучуга кабарлоо
      }
    }
    
    fetchData();
    
  2. catch() ыкмасы awaitтен кийин: Азыркы учурда сунушталбайт, бирок мүмкүн. Каталар .catch() callbackинде иштетилет, эгер убада четке кагылса.

    async function fetchData() {
      const response = await fetch('https://api.example.com/data')
        .catch(error => {
          console.error('Fetch аткарууда ката:', error);
          // Fetch катасын иштетүү
          throw error; // Кийинки иштетүү үчүн катаны өткөрүп берүү
        });
    
      if (response && !response.ok) {
           console.error(`HTTP ката! стат: ${response.status}`);
           // HTTP катасын иштетүү
      }
    
      if (response && response.ok) {
          const data = await response.json()
              .catch(error => {
                  console.error('JSON парсинг учурунда ката:', error);
                  // JSON парсинг катасын иштетүү
              });
          if (data) {
              console.log(data);
          }
      }
    }
    
    fetchData();
    

    Бул ыкма көп учурда көптөгөн потенциалдуу каталар чекиттеринде татаал болушу мүмкүн.

  3. Катаны кайтаруу менен иштетүү: Кээ бир китепканалар же өзүнчө функциялар [маалымат, ката] кортежин кайтарат, убададан баш тартпастан.

    async function safelyFetchData() {
       const [data, error] = await safePromise(fetch('https://api.example.com/data'));
       if (error) {
          console.error('Жалпы каталар:', error);
          return null; // же башка катаны көрсөтүүчү маані
       }
       // safePromise response.ok да иштетет деп эсептейбиз
       console.log(data);
       return data;
    }
    
    // safePromiseдин жөнөкөйлөштүрүлгөн мисалы
    async function safePromise(promise) {
        try {
            const result = await promise;
             // Бул жерде result.ok текшерүү мүмкүн, fetch үчүн
             if (result && result.ok !== undefined && !result.ok) {
                 throw new Error(`HTTP ката! стат: ${result.status}`);
             }
            // fetch үчүн, мүмкүн болсо, 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();
    

    Бул үлгү (көбүнчө "error-first callback" же "go-style error handling" деп аталат) функциянын аткарылышын үзбөстөн, каталарды жергиликтүү иштетүүгө ыңгайлуу.

Эң таза жана окула турган жол try...catch колдонуу, ал await камтыган код блокунун тегерегинде: