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 պարունակող կոդի բլոկի շուրջ: