Истисноҳо дар занҷири ваъдҳо дар JavaScript
Бигзор ба сабабҳое ваъди мо бо хатогӣ анҷом ёбад:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('хатогӣ');
}, 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) {
// дар сурати хатогӣ ба инҷо меоем
}
);
Дар ин ҳол истисно метавонад худи
ваъд пайдо шавад, ё тавассути 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) {
// дар ин ҷо хатогиро ҳал мекунем
}
);