Tao Sliby
S trochou více zkušeností a porozumění, Slibů a monadická zákony, které upravují jeho použití, nebylo by strávil tolik času pracuje na refaktorovat tohoto kusu kódu.
v JavaScriptu lze asynchronní kód zpracovat pomocí slibů, což jsou pokračovací monády JavaScriptu. Nejdůležitější věc v tomto případě o Sliby, že monáda je, že po právu je pravda:
Promise.resolve(Promise.resolve(x)) === Promise.resolve(x).
mnohem důležitější, než výše uvedené, je to také platí pro libovolnou hodnotu x:
Promise.resolve(Promise.reject(x)) === Promise.reject(Promise.resolve(x)) === Promise.reject(x).
toto magické pravidlo výše je to, co mi na konci dne zachránilo nějakou myšlenkovou sílu. To znamenalo, že jsem mohl s těmito chybami zacházet, jakmile k nim došlo, uvnitř jejich vlastních funkcí, držet se dál od toho šílenství s dlouhým řetězcem. Odpověď byla vždy tam zíral na mě, Jen jsem nemohl vidět. Teď vidím a je to krásné.
To znamenalo, že jsem mohl jednoduše saveApplication funkce, jako je tento, například:
function saveApplication() {
return makeApiCall().catch((err) => Promise.reject('basic'));
}
.catch block znamená, že zpracováváme chybu v základním kroku formuláře, protože volání saveApplication souvisí s krokem formuláře zvaným basic. To nás vedlo k nádhernému kousku kódu dole:
saveApplication()
.then(uploadImages)
.then(saveService)
.then(savePricingInfo)
.then(savePaymentInfo)
.then(gotoMainPage)
.catch((step) => {
setErrorState();
multiStepManager.go(step);
});
museli jsme změnit pouze jeden řádek slibného řetězce, nyní, když všechny funkce uvnitř .pak bloky vrátí slib, který již odmítá odpovídající krok.
ale co když se staly jiné typy chyb, které nebyly řešeny vnitřními úlovky?
to lze snadno vyřešit implementací vlastních typů chyb a oddělením hodnocení různých typů chyb uvnitř našeho hlavního .chytit blok. Takto:
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
}
});
v tomto případě hlavní .catch block zpracovává pouze chyby typu StepError. Jiné typy chyb jsou jednoduše hozeny, nikoli odmítnuty, takže je lze odpovídajícím způsobem zpracovat aplikací nebo prohlížečem.
stejný princip může a měl by být rozšířen pro zpracování konkrétních typů chyb, jako jsou různé stavy HTTP.