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) {
// қателік болған жағдайда осы жерге түсеміз
}
);
Бұл ретте ерекше жағдай уәденің өзінде
пайда болуы мүмкін, не тізбектің кез келген буынында
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) {
// осы жерде қателікті шешеміз
}
);