JavaScript да промислар занжиридаги истиснолар
Баъзи сабабларга кўра бизнинг промисимиз хато билан тугаси:
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) {
// хатолик юз берганда шу ёққа кирамиз
}
);
Бунда истисно ўзидаги промисда пайдо бўлиши
mumkin, ёки 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) {
// энг яқин ўзловчи
}
);
Эътибор бering, catch айникса
хатоликни диагностика қилиш учун керак:
у ҳал қилинадими ёки йўқми.
Aгар хатолик ҳал қилинади бўлса, catch
унинг ечимини ўзидан кейинги then га ўтказаши керак.
Aгар ҳал қилинмаса (ёки маълум catch
уни қандай ҳал қилишни билмаса), у ҳолда биз
ҳеч нарса қайтармаслигимиз ёки истисно ташлашимиз керак:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (хатоликҲалБулади) {
return 'маълумот'; // кейинги then га юборамиз
} else {
// ҳеч нарса қайтармаймиз ёки истисно ташлаймиз
}
}
).then(
function(result) {
// хатоликни шу ерда ҳал қиламиз
}
);