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:
-
try...catchkonstrukcija: 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(); -
.catch()metodas poawait: 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.
-
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ą.