Исклучи во синџирите на promises во JavaScript
Нека поради некоја причина нашиот promise заврши со грешка:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
Во овој случај, извршувањето на кодот веднаш ќе премине
кон оној then во кој има функција-обработувач
за грешка, или кон првиот catch, во зависност
кој ќе се сретне прв.
Еве пример за првата ситуација:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// извршувањето веднаш ќе премине овде
}
).then(
function(result) {
console.log(result);
}
);
Еве пример за втората ситуација:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// извршувањето веднаш ќе премине овде
}
).then(
function(result) {
console.log(result);
}
);
Функцијата-обработувач има две опции за дејствување:
ако успеала да ја реши исклучителната ситуација,
тогаш може да врати резултат преку return
и извршувањето ќе продолжи понатаму по синџирот.
Ако пак не успеала да ја реши грешката, тогаш може
или да не врати ништо, или да фрли исклучок
преку throw. Во овој случај, извршувањето
ќе премине кон следниот фаќач на грешки
(во then или catch - кој ќе се сретне
прв).
Во принцип, сите грешки од синџирот се фаќаат
на едно место: на крајот од синџирот се поставува
catch:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// ќе стигнеме овде во случај на грешка
}
);
При тоа, исклучокот може да се појави во самиот
promise, или да биде фрлен преку throw
во кое било од врските на синџирот:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (сèЕВоред) {
return result + '2';
} else {
throw new Error('грешка'); // преминуваме кон најблискиот фаќач
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// најблискиот фаќач
}
);
Имајте на ум дека catch е потребен токму
за дијагностицирање на грешката: дали е решлива или не.
Ако грешката е решлива, тогаш catch треба
да го пренесе нејзиното решение кон следниот then
по себе.
Ако не е решлива (или овој catch
едноставно не знае како да ја реши), тогаш мораме
или да не вратиме ништо или да фрлиме исклучок:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (грешкатаЕРешлива) {
return 'податоци'; // испраќаме до следниот then
} else {
// не враќаме ништо или фрламе исклучок
}
}
).then(
function(result) {
// овде ја решаваме грешката
}
);