Autor Zpráva
weroro
Profil
Zdravím.

Mám možno veľmi začiatočnícku otázku ohľadom výstupu funkcií, konkrétne ako správne určiť, čo má byť vrátené ako error a čo ako správny výstup.

Modelová situácia: Mám funkciu, ktorá vracia Promise (resolve, reject). V tele Promise sa vykonáva logika, kde môžu nastať 3 stavy s číselnou hodnotou.

Success = 1
Not Found = 2
Invalid data = 3

Moja otázka znie: Majú byť tieto 3 stavy dostupné všetky v resolve alebo stavy 2 a 3 presunúť do reject? Logicky by to malo asi byť v reject, keďže sa jedná o chybový stav.

Ukážka s resolve:
example()
    .then(resultCode => {
        if (resultCode === 1)
            console.log('success');
        else if (resultCode === 2)
            console.log('not found');
        else if (resultCode === 3)
            console.log('invalid data');
    });

Ukážka s resolve a reject:
example()
    .then(resultCode => {
        if (resultCode === 1)
            console.log('success');
    })
    .catch(resultCode => {
        if (resultCode === 2)
            console.log('not found');
        else if (resultCode === 3)
            console.log('invalid data');
    })

Možno to vyzerá, že si robím srandu, ale bohužiaľ. Na jednu stranu mi príde v poriadku mať všetky stavy dostupné v jednom kontexte (viem použiť napr switch a pod., prípadne ich nejak kombinovať). Na druhú stranu mi príde viac logické oddeliť success "vrstvu" od error "vrstvy".

Ako sa vy rozhodujete pri podobných situáciách? Nejaký váš myšlienkový pochod.

Ďakujem za váš čas pri zamyslení sa nad touto mojou zváštnou dilemou.
JsonKody
Profil
weroro:
Tohle je vec kterou jsem pomerne nedavno celkem intenzivne resil, kdyz jsem se snazil udelat vlastni mensi 'wrapper' okolo Fetch API.
(Resp. ja ho udelal - kdyz jsem se snazil ho dotahnout do dokonalosti :) )

Prijde mi ale, ze ten priklad je prilis vagni na to aby se na nej dalo odpovedet - result code ma byt tipuji asi neco jako HTTP status code (200 - OK, 404 - not found atd.) ze?
Potom bych resil samotne kody v tom wrapperu a tudiz by to asi vypadalo spise jako druhy priklad:
.then().catch()
.. v zavislosti na kodu by wrapper rozhodl jestli Promise projde s resolve nebo neprojde (reject) - to by byla ta obalova logika, a tu naslednou logiku by sis uz resil v tech blocich, podle toho jestli to proslo nebo ne.

Ale celkove asi zalezi podle toho co vlastne od toho chces :)
Asi jsem moc nepomohl.


----------------------------------------------------------------------------------
Toliko moje opodved, schvalne se pojdme podivat co na to rekne gpt4 xD:
----------------------------------------------------------------------------------

Zdravím!

Váš dotaz je úplně legitimní, a je dobré zamyslet se nad tím, jak správně strukturovat kód v takovýchto situacích. Správný přístup závisí na konkrétní situaci a na tom, jak chcete s výsledky dále pracovat.

V tomto případě bych navrhoval použít kombinaci resolve a reject, jak jste uvedl ve druhé ukázce. Je důležité oddělit úspěšný výstup (success) od chybových stavů (not found, invalid data), protože takovéto rozdělení umožňuje snadněji spravovat chybové stavy a lépe se orientovat v kódu.

Použitím resolve pro úspěšný výstup a reject pro chybové stavy je kód přehlednější, což umožňuje snadnější údržbu a ladění. Můžete také jednodušeji řetězit více operací, které by měly proběhnout pouze v případě úspěchu.

example()
    .then(resultCode => {
        console.log('success');
        return anotherOperation(); // Vykoná další operaci jen v případě úspěchu
    })
    .catch(resultCode => {
        if (resultCode === 2)
            console.log('not found');
        else if (resultCode === 3)
            console.log('invalid data');
    });

Nicméně je důležité zmínit, že v některých situacích může být užitečné mít všechny stavy v jednom kontextu. Pokud si myslíte, že je pro váš konkrétní případ vhodnější mít všechny stavy dostupné v jednom kontextu, pak je to také v pořádku. Klíčem je udržet kód čistý, udržitelný a srozumitelný pro ostatní vývojáře.

V konečném důsledku záleží na vašem úsudku a na tom, co je pro daný případ nejvhodnější.


----------------------------------------------------------------------------------

Ano, naprosto souhlasim, ja to jen napsal trochu lineji a zkracene ..
takze se s gpt4 shodneme ;)

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0