JavaScript-də Promise Zəncirlərində İstisnalar
Tutaq ki, nə səbəbdənsə bizim promise xəta ilə yekunlaşacaq:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
Bu halda kodun icrası dərhal
xətanı emal edən funksiyanın olduğu
then-ə, ya da ilk catch-ə keçəcək,
hansı əvvəl gəlirsə.
Burada birinci vəziyyətə nümunə:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// icra dərhal buraya keçəcək
}
).then(
function(result) {
console.log(result);
}
);
Burada ikinci vəziyyətə nümunə:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// icra dərhal buraya keçəcək
}
).then(
function(result) {
console.log(result);
}
);
Emal funksiyasının iki seçimi var:
əgər o, istisnai vəziyyətin öhdəsindən gəldisə,
onda return ilə nəticə qaytara bilər
və icra zəncir boyu davam edəcək.
Əgər o, xətanın öhdəsindən gələ bilmirsə, onda
ya heç nə qaytarmaya bilər, ya da throw
vasitəsilə istisna atabilər. Bu halda icra
növbəti xəta tutucuya keçəcək
(then və ya catch - hansı əvvəl gəlirsə).
Bir qayda olaraq, bütün zəncir xətaları
bir yerdə tutulur: zəncirin sonunda
catch yerləşdirilir:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// xəta olduqda buraya düşəcəyik
}
);
Bu zaman istisna özü promise-də yarana bilər,
ya da zəncirin hər hansı bir halqasında
throw vasitəsilə atıla bilər:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (hərŞeyYaxşıdır) {
return result + '2';
} else {
throw new Error('xəta'); // ən yaxın tutucuya keçirik
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// ən yaxın tutucu
}
);
Nəzərə alın ki, catch xüsusilə
xətanın diaqnostikası üçün lazımdır: onun həlli var ya yox.
Əgər xətanın həlli varsa, onda catch
onun həllini özündən sonrakı then-ə ötürməlidir.
Əgər həlli yoxdursa (və ya bu catch
sadəcə onu necə həll edəcəyini bilmir), onda biz
ya heç nə qaytarmamalıyıq ya da istisna atmalıyıq:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (xətaHəllOlunandır) {
return 'məlumat'; // növbəti then-ə göndəririk
} else {
// heç nə qaytarmırıq və ya istisna atırıq
}
}
).then(
function(result) {
// burada xətanı həll edirik
}
);