JavaScript: callback, promises, async/await, naposledy…

Mám pocit, že čím dál víc javascriptových vývojářů používá nové jazykové kostrukce pro práci s asynchronním kódem, ale ne všichni mu rozumí jak by měli a jen slepě používají něco co viděli někde jinde. Proto naposledy tohle velice stručné, ale podle mě snad všeříkající shrnutí všech možných současných variant pro psaní asynchronních operací:

// definice funkce vracejici vysledek callbackem
function sumCallback(a, b, cb) {
    cb(a + b);
}

// samotne volani funkce s vysledkem v callback funkci
sumCallback(20, 30, res => {
    console.log(res);
});

// alternativa callbackove funkce realizavana pres Promises
function sumPromises(a, b) {
    return new Promise(res => {
        sumCallback(a, b, resCb => {
            res(resCb);
        });
    });
}

// volani Promises funkce s then pro ziskani vysledku
sumPromises(20, 40).then(res => console.log(res));

// definice async funckce
// klicove slovo await jde pouzit jen uvnitr async funkce 
async function sumAsync(a, b) {
    return await sumPromises(a, b);
}

// volani async funkce
// abych mohl pouzit await, musim zabalit do async funkce
(async (a, b) => {
    console.debug('start');
    let res = await sumPromises(a, b);
    console.log(res);
})(20, 70);

// uplne stejne jako vyse
// misto sumPromises je sumAsync
// protoze async/await je interne realizovan pres Promises... :)
(async (a, b) => {
    console.debug('start');
    let res = await sumAsync(a, b);
    console.log(res);
})(20, 70);

Dodám, že v TypeScriptu se píše asynchronní kód úplně stejně.