Izņēmumi promisu ķēdēs JavaScript
Pieņemsim, ka kādu iemeslu dēļ mūsu promiss pabeidzas ar kļūdu:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
Šajā gadījumā koda izpilde nekavējoties pāries
uz to then, kurā ir kļūdas apstrādes funkcija,
vai uz pirmo catch, atkarībā no tā,
kas parādās agrāk.
Šeit ir piemērs pirmajai situācijai:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// izpilde nekavējoties pāries uz šo punktu
}
).then(
function(result) {
console.log(result);
}
);
Šeit ir piemērs otrai situācijai:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// izpilde nekavējoties pāries uz šo punktu
}
).then(
function(result) {
console.log(result);
}
);
Kļūdu apstrādes funkcijai ir divas darbības iespējas:
ja tā ir tikuši galā ar izņēmuma situāciju,
tā var atgriezt rezultātu, izmantojot return,
un izpilde turpināsies tālāk pa ķēdi.
Ja tā nav tikuši galā ar kļūdu, tā var
neko neatgriezt vai izmest izņēmumu,
izmantojot throw. Šajā gadījumā izpilde
pāries uz nākamo kļūdu pārtvērēju
(then vai catch - atkarībā no tā, kas parādās
agrāk).
Parasti visas ķēdes kļūdas tiek pārtvertas
vienā vietā: ķēdes beigās tiek ievietots
catch:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// nonāksim šeit kļūdas gadījumā
}
);
Šajā gadījumā izņēmums var rasties pašā
promisā vai tikt izmests, izmantojot throw,
jebkurā ķēdes posmā:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (vissIrLabi) {
return result + '2';
} else {
throw new Error('kļūda'); // pārejam uz tuvāko pārtvērēju
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// tuvākais pārtvērējs
}
);
Ņemiet vērā, ka catch ir nepieciešams tieši
kļūdas diagnosticēšanai: vai tā ir atrisināma vai nē.
Ja kļūda ir atrisināma, tad catch ir jānodod
tās risinājums sekojošajam then.
Bet ja tā nav atrisināma (vai šis konkrētais catch
vienkārši nezina, kā to atrisināt), tad mums vai nu
nekas nav jāatdod, vai jāizmet izņēmums:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (kļūdaIrAtrisināma) {
return 'dati'; // nosūtām uz nākamo then
} else {
// nekā neatgriežam vai izmetam izņēmumu
}
}
).then(
function(result) {
// šeit atrisinām kļūdu
}
);