JavaScript-da Promise zanjirlarida istisnolar
Faraz qilaylik, nimadir sababli bizning promise'imiz xato bilan tugasa:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
Bunday holatda kod bajarilishi darhol
xato uchun ishlovchi funktsiya mavjud bo'lgan
birinchi thenga yoki birinchi catchga
o'tadi, qaysi biri oldinroq uchrashiga qarab.
Bu yerda birinchi holat misoli:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// bajarilish darhol shu yerga o'tadi
}
).then(
function(result) {
console.log(result);
}
);
Bu yerda ikkinchi holat misoli:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// bajarilish darhol shu yerga o'tadi
}
).then(
function(result) {
console.log(result);
}
);
Ishlovchi funktsiyaning ikkita harakat varianti bor:
agar u istisno holatini hal qila olsa,
return orqali natija qaytarishi mumkin
va bajarilish zanjir bo'yicha davom etadi.
Agar u xatoni hal qila olmasa, unda
hech narsa qaytarmasligi yoki throw orqali
istisno tosshi mumkin. Bunda bajarilish
keyingi xato ushlagichiga o'tadi
(thenda yoki catchda - qaysi biri oldinroq uchrasha).
Odatda, zanjirdagi barcha xatolar
bitta joyda ushlanadi: zanjir oxirida
catch joylashtiriladi:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// xato bo'lsa shu yerga tushamiz
}
);
Bunda istisno promisening o'zida
paydo bo'lishi mumkin, yoki zanjirning istalgen
bog'lagida throw orqali tashlanishi mumkin:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (hammasiYaxshi) {
return result + '2';
} else {
throw new Error('xato'); // eng yaqin ushlagichga o'tamiz
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// eng yaqin ushlagich
}
);
Yodda tuting, catch aynan
xatoni diagnostika qilish uchun kerak: u hal qilinadimi yoki yo'q.
Agar xato hal qilinadigan bo'lsa, catch
uning yechimini o'zidan keyingi thenga uzatishi kerak.
Agar hal qilinadigan bo'lmasa (yoki ushbu catch
shunchaki uni qanday hal qilishni bilmasa), unda biz
hech narsa qaytarmasligimiz yoki istisno tosshimiz kerak:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (xatoHalQilinadigan) {
return 'ma\'lumot'; // keyingi then ga yuboramiz
} else {
// hech narsa qaytarmaymiz yoki istisno tosshamiz
}
}
).then(
function(result) {
// bu yerda xatoni hal qilamiz
}
);