Erindid JavaScripti lubaduste ahelates
Oletame, et mingil põhjusjal meie lubadus lõppeb veaga:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
Sel juhul liigub koodi täitmine kohe
sinna then blokki, kus on veatöötleja funktsioon,
või esimesele catch blokile, olenevalt
sellest, kumb esimesena tuleb.
Siin on näide esimesest olukorrast:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// täitmine hüppab kohe siia
}
).then(
function(result) {
console.log(result);
}
);
Siin on näide teisest olukorrast:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// täitmine hüppab kohe siia
}
).then(
function(result) {
console.log(result);
}
);
Vea töötleja funktsioonil on kaks võimalust:
kui ta sai eriolukorraga hakkama,
saab ta tagastada tulemu return kaudu
ja täitmine jätkub edasi ahelas.
Kui ta ei saanud veaga hakkama, siis võib
ta kas midagi tagastamata jätta või visata erindi
kasutades throw. Sel juhul liigub täitmine
järgmise vea püüdja juurde
(then või catch blokki - olenevalt, kumb
esimesena tuleb).
Tavaliselt püütakse kõik ahela vead kokku
ühes kohas: ahela lõppu paigutatakse
catch:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// jõuame siia vea korral
}
);
Sel juhul võib erind tekkida lubaduses endas,
või olla visatud kasutades throw
ükskõik millises ahela lülis:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (kõikOnKorras) {
return result + '2';
} else {
throw new Error('viga'); // liigume lähima püüdja juurde
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// lähim püüdja
}
);
Pidage meeles, et catch on vaja just
vea diagnoosimiseks: kas see on lahendatav või mitte.
Kui viga on lahendatav, siis catch peaks
andma selle lahenduse edasi endale järgnevale then blokile.
Kui aga pole lahendatav (või antud catch
lihtsalt ei tea, kuidas seda lahendada), siis peame
kas midagi tagastamata jätma või erindi viskama:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (vigaOnLahendatav) {
return 'andmed'; // saadame järgmisele then blokile
} else {
// ei tagasta midagi või viska erindit
}
}
).then(
function(result) {
// siin lahendame vea
}
);