JavaScript-da pursatlar zynjyrynda çaklamalar
Gowşuranyň, nämä üçindir biziň pursadymyz säwlik bilen gutarýar:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
Bu ýagdaýda kodyň ýerine ýetirilmegi derrew geçer
o then-a, niredä säwligiň işleýji funksiýasy
bar ýa-da birinji catch-a, nämesiniň
öňüni alýandygyna garap.
Bu ýerde birinji ýagdaýyň mysaly:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// ýerine ýetirilmegi derrew şu ýere geçer
}
).then(
function(result) {
console.log(result);
}
);
Bu ýerde ikinji ýagdaýyň mysaly:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// ýerine ýetirilmegi derrew şu ýere geçer
}
).then(
function(result) {
console.log(result);
}
);
Işleýji funksiýanyň hereket etmek üçin iki warianty bar:
eger ol çaklama ýagdaýy bilen işlän bolsa,
onda return arkaly netijäni gaýdyp biler
we ýerine ýetirilmegi zynjyr boýunça dowam eder.
Eger bolsa ol säwlik bilen işlän bolmasa, onda
ýa-da hiç zat gaýtarmaz, ýa-da çaklamany
throw arkaly taşlap biler. Bu ýagdaýda ýerine ýetirilmegi
indiki säwlik tutujy öňüne geçer
(then ýa-da catch - nämesiniň öňüni alýandygyna
garap).
Adatça, zynjyryň ähli säwlikleri
bir ýerde tutulýar: zynjyryň ahyrynda ýerleşdirilýär
catch:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// säwlik ýagdaýynda şu ýere düşeris
}
);
Şonuň bilen çaklama özünde pursatda
döräp biler, ýa-da throw arkaly
zynjyryň haýsy hem bolsa bir baglanyşygynyň işinde taşlap biliner:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (hemmeGowy) {
return result + '2';
} else {
throw new Error('säwlik'); // iň ýakyn tutujy öňüne geçýäris
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// iň ýakyn tutujy
}
);
Üns beriň, catch aslynda zerurdyr
säwligiň diagnostikasy üçin: oňa çözgüt tapylýarmy ýa-da ýokmy.
Eger säwlige çözgüt tapylýan bolsa, onda catch onuň
çözgüdini özünden soňky then-e geçirmeli.
Eger bolsa çözgüt tabyly bolmasa (ýa-da bu catch
diňe onuň nähili çözmelidigini bilmeýän), onda biz
ýa-da hiç zat gaýtarmaly däl ýa-da çaklama taşlamaly:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (säwlikÇözüliýär) {
return 'maglumatlar'; // indiki then-e iberýäris
} else {
// hiç zat gaýtarmaly däl ýa-da çaklama taşlamaly
}
}
).then(
function(result) {
// şu ýerde säwligi çözýäris
}
);