Refaktoring starého JavaScriptu: callbacky na async/await
Starý kód s callbacky často připomíná noční můru. Vnořené funkce, chybové stavy na deseti místech, obtížné testování. Přechod na async/await slibuje čistší a čitelnější kód, ale v produkci si nemůžete dovolit rozbít existující funkčnost. Klíčem je postupná migrace a důkladné pokrytí testy. Pokud chcete minimalizovat riziko, začněte tím, že si osvojíte zásady čistého kódu v JavaScriptu – pomohou vám udržet refaktoring pod kontrolou.
Prvním krokem je izolovat callbacky, které lze snadno převést. Zaměřte se na funkce, které volají jediný asynchronní úkol a nemají složitou logiku. Vytvořte wrapper, který vrátí Promise, a teprve pak ji nahraďte async/await. Například funkci fs.readFile(path, callback) obalte do const readFile = (path) => new Promise((resolve, reject) => fs.readFile(path, (err, data) => err ? reject(err) : resolve(data))). Tím získáte kompatibilní vrstvu, která funguje jak se starým, tak s novým kódem. Produkce běží dál, vy postupně přepisujete volání.
Při samotné výměně callbacků za async/await dávejte pozor na sdílený stav a pořadí operací. Callbacky často spoléhají na to, že se spustí v určitém pořadí, což async/await nezaručuje. Vždy explicitně ošetřete chyby pomocí try/catch a nepředpokládejte, že se výjimka ztratí. Pokud narazíte na problém, použijte logger nebo breakpoint a ověřte, zda nová verze vrací stejné výsledky jako ta původní. Testy by měly pokrývat jak úspěšné, tak chybové scénáře.
Nakonec nasazujte po malých částech. Místo jednoho velkého commitu vytvořte sérii menších změn, každou otestujte v produkčním prostředí. Můžete použít feature flag a postupně zapínat novou implementaci pro procento uživatelů. Tím se vyhnete výpadkům a získáte jistotu, že refaktoring proběhl správně. Async/await není všelék, ale při rozumném tempu výrazně zpřehlední i ten nejzapletenější kód.