Maybaygiare.org

Blog Network

hibakezelés hosszú Ígéretláncokban

az ígéretek Tao-ja

egy kicsit több tapasztalattal és megértéssel az ígéretekről és a használatát szabályozó monádikus törvényekről, nem töltöttünk volna annyi időt ennek a kódnak a refaktorán.

a JavaScriptben az aszinkron kód az ígéretek segítségével kezelhető, amelyek a JavaScript folytatási monádjai. A legfontosabb dolog ebben az esetben a monád ígéreteivel kapcsolatban az, hogy a következő törvény igaz:

Promise.resolve(Promise.resolve(x)) === Promise.resolve(x).

és fontosabb, mint a fenti, ez minden X értékre is érvényes:

Promise.resolve(Promise.reject(x)) === Promise.reject(Promise.resolve(x)) === Promise.reject(x).

Ez a fenti mágikus szabály mentette meg a gondolat erejét a nap végén. Ez azt jelentette, hogy kezelni tudtam ezeket a hibákat, amint megtörténtek, a saját funkcióikon belül, távol maradva ettől a hosszú lánc őrülettől. A válasz mindig ott volt, bámult rám, csak nem láttam. Most már látom, és gyönyörű.

most ez egy jó, igaz ígéret

Ez azt jelentette, hogy egyszerűen a saveapplication függvény, mint ez, például:

function saveApplication() {
return makeApiCall().catch((err) => Promise.reject('basic'));
}

a .a fogási blokk azt jelenti, hogy hibát kezelünk az űrlap alaplépésén, mert a saveApplication hívás a basic nevű űrlap lépéséhez kapcsolódik. Ez vezetett minket az alábbi gyönyörű kódrészlethez:

saveApplication()
.then(uploadImages)
.then(saveService)
.then(savePricingInfo)
.then(savePaymentInfo)
.then(gotoMainPage)
.catch((step) => {
setErrorState();
multiStepManager.go(step);
});

csak az Ígéretlánc egyetlen sorát kellett megváltoztatnunk, most, hogy az összes funkció a.ezután blocks visszaad egy ígéretet, amely már elutasítja a megfelelő lépést.

de mi van, ha más típusú hibák történtek, amelyeket a belső fogások nem kezeltek?

Nos, ez könnyen megoldható az egyéni hibatípusok végrehajtásával, valamint a különböző hibatípusok értékelésének elválasztásával a főnkben .fogási blokk. Így:

function saveApplication() {
return makeApiCall().catch((err) => Promise.reject(new StepError('basic')));
}//
saveApplication()
.then(uploadImages)
.then(saveService)
.then(savePricingInfo)
.then(savePaymentInfo)
.then(gotoMainPage)
.catch((step) => {
if(err instanceof StepError) {
setErrorState();
multiStepManager.go(step);
}
else {
// handle other types of errors
}
});

ebben az esetben a fő .a catch block csak a StepError típusú hibákat kezeli. Más típusú hibákat egyszerűen eldobnak, nem utasítanak el, így az alkalmazás vagy a böngésző ennek megfelelően kezelheti őket.

ugyanez az elv kiterjeszthető és ki kell terjeszteni bizonyos hibatípusok, például különböző HTTP állapotok kezelésére.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.