[Node.js] Callback VS Promise VS async/await

Here is an example that show you why you have to use async/await especially in many callback functions in a single task. Assume that we have a function which multiply ‘x’ by 2 (200 ms).

output = x * 2

Here is the function with a callback parameter.

function slowDoubleCallback(x, callback) {
    setTimeout(() => {
        callback(x * 2);
    }, 200);
}

If we would like to call it 10 times, in callback version would be like this:

// Callback Hell Version
let callBackAns = 0;
slowDoubleCallback(1, (ans) => {
    callBackAns += ans;
    slowDoubleCallback(2, (ans) => {
        callBackAns += ans;
        slowDoubleCallback(3, (ans) => {
            callBackAns += ans;
            slowDoubleCallback(4, (ans) => {
                callBackAns += ans;
                slowDoubleCallback(5, (ans) => {
                    callBackAns += ans;
                    slowDoubleCallback(6, (ans) => {
                        callBackAns += ans;
                        slowDoubleCallback(7, (ans) => {
                            callBackAns += ans;
                            slowDoubleCallback(8, (ans) => {
                                callBackAns += ans;
                                slowDoubleCallback(9, (ans) => {
                                    callBackAns += ans;
                                    slowDoubleCallback(10, (ans) => {
                                        callBackAns += ans;
                                        console.log("Callback: " + callBackAns);
                                    });
                                });
                            });
                        });
                    });
                });
            });
        });
    });
});

That is horrible, right? Now, make a Promise version. To do this, we need to modify the function to return Promise object:

function slowDouble(x) {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(x * 2);
        }, 200);
    });
}

To call it 10 times, would be like this:

// Promise Version
let promiseAns = 0;
slowDouble(1).then((ans) => {
    promiseAns += ans;
    return slowDouble(2);
}).then((ans) => {
    promiseAns += ans;
    return slowDouble(3);
}).then((ans) => {
    promiseAns += ans;
    return slowDouble(4);
}).then((ans) => {
    promiseAns += ans;
    return slowDouble(5);
}).then((ans) => {
    promiseAns += ans;
    return slowDouble(6);
}).then((ans) => {
    promiseAns += ans;
    return slowDouble(7);
}).then((ans) => {
    promiseAns += ans;
    return slowDouble(8);
}).then((ans) => {
    promiseAns += ans;
    return slowDouble(9);
}).then((ans) => {
    promiseAns += ans;
    return slowDouble(10);
}).then((ans) => {
    console.log("Promise: " + (promiseAns + ans));
});

Much better in Promise version? Now in async/await version:

// async / await Version
(async () => {
    let ans = 0;
    ans += await slowDouble(1);
    ans += await slowDouble(2);
    ans += await slowDouble(3);
    ans += await slowDouble(4);
    ans += await slowDouble(5);
    ans += await slowDouble(6);
    ans += await slowDouble(7);
    ans += await slowDouble(8);
    ans += await slowDouble(9);
    ans += await slowDouble(10);
    console.log("async/await: " + ans);
})();

Extremely clear, isn’t it? Not just for readability. You could add for-loop here like structured programming which is difficult in callback/promise (Edit: a redditor pointed out that you can do this with Promise) version.

// async / await Version 2
(async () => {
    let ans = 0;
    for (let i = 1; i <= 10; i++) {
        ans += await slowDouble(i);
    }
    console.log("async/await Version 2: " + ans);
})();

Hope you could feel the benefit of async/await after read the example. Not saying callback is useless, it is still useful in a simple situation. However, it is much clear to write async/await in complicated situation.

Tested on: Node.js 8.10.0

Gist:
https://gist.github.com/louislam/a4ffc57fb9fd4596a0092d1054eabcee

Reddit Thread:
https://www.reddit.com/r/javascript/comments/85j6tu/for_beginners_i_wrote_an_article_to_help_you/

和楽器バンド – 雨のち感情論 LRC 歌詞

[00:13.812]朝焼けの霧に滲む
[00:18.843]囁く彼方の声
[00:24.027]夢が覚め遠く満ちる
[00:29.207]時の訪れ
[00:32.726]
[00:33.782]手に落ちた露に映る
[00:38.816]そなたの面影
[00:43.963]待てど いずこ うつつに
[00:49.812]心の奥で 彷徨う
[00:55.692]
[00:57.590]儚く揺れる
[01:00.900]なでしこ桜
[01:02.986]乱世で生まれた花よ
[01:07.887]紅く染められ
[01:10.491]今、よみがえる
[01:13.152]あの日のにほひ
[01:17.577]夜に開く花ビラ
[01:21.772]
[01:36.366]音もなく 続く道を
[01:41.337]守るべき者のため
[01:46.590]ひとときの 闇を照らす
[01:51.720]月影ぼうし
[01:55.476]
[01:56.290]深き淵に霞める
[02:01.337]そなたの指切り
[02:06.457]忍び 宿る 絆と
[02:12.311]心を盾に貫け
[02:17.308]
[02:17.615]艶やかに舞う
[02:20.191]なでしこ桜
[02:22.857]乱世で朽ちてく花よ
[02:27.862]風にたわむれ
[02:30.441]今、枝垂(しだ)れゆく
[02:33.117]微(かす)かなにほひ
[02:37.571]色は移りにけりな
[02:42.216]
[02:43.561]今ひとつ またひとつ 零れゆく
[02:46.346]花海に うずもれて
[02:48.267]永遠に巡り巡る夢見草
[02:52.397]
[03:17.037]儚く揺れる
[03:19.631]なでしこ桜
[03:22.092]乱世で生まれた花よ
[03:27.308]紅く染められ
[03:29.811]今、よみがえる
[03:32.495]あの日のにほひ
[03:36.912]夜に開く花ビラ
[03:40.939]
[03:42.133]忘れることなかれ
[03:47.148]

和楽器バンド – なでしこ桜 LRC 歌詞

[00:13.812]朝焼けの霧に滲む
[00:18.843]囁く彼方の声
[00:24.027]夢が覚め遠く満ちる
[00:29.207]時の訪れ
[00:32.726]
[00:33.782]手に落ちた露に映る
[00:38.816]そなたの面影
[00:43.963]待てど いずこ うつつに
[00:49.812]心の奥で 彷徨う
[00:55.692]
[00:57.590]儚く揺れる
[01:00.900]なでしこ桜
[01:02.986]乱世で生まれた花よ
[01:07.887]紅く染められ
[01:10.491]今、よみがえる
[01:13.152]あの日のにほひ
[01:17.577]夜に開く花ビラ
[01:21.772]
[01:36.366]音もなく 続く道を
[01:41.337]守るべき者のため
[01:46.590]ひとときの 闇を照らす
[01:51.720]月影ぼうし
[01:55.476]
[01:56.290]深き淵に霞める
[02:01.337]そなたの指切り
[02:06.457]忍び 宿る 絆と
[02:12.311]心を盾に貫け
[02:17.308]
[02:17.615]艶やかに舞う
[02:20.191]なでしこ桜
[02:22.857]乱世で朽ちてく花よ
[02:27.862]風にたわむれ
[02:30.441]今、枝垂(しだ)れゆく
[02:33.117]微(かす)かなにほひ
[02:37.571]色は移りにけりな
[02:42.216]
[02:43.561]今ひとつ またひとつ 零れゆく
[02:46.346]花海に うずもれて
[02:48.267]永遠に巡り巡る夢見草
[02:52.397]
[03:17.037]儚く揺れる
[03:19.631]なでしこ桜
[03:22.092]乱世で生まれた花よ
[03:27.308]紅く染められ
[03:29.811]今、よみがえる
[03:32.495]あの日のにほひ
[03:36.912]夜に開く花ビラ
[03:40.939]
[03:42.133]忘れることなかれ
[03:47.148]

和楽器バンド – CLEAN LRC 歌詞

[00:35.801]ごめんね、 優(やさ)しくできなくて
[00:40.344]ごめんね、 上手(じょうず)に言(い) えなくて
[00:44.885]ごめんね、 心配(しんぱい)をかけて
[00:49.345]ごめんね、だから 言(い) わせてよ
[00:53.748]
[00:54.025]ありがとう、ついてきてくれて
[00:58.200]ありがとう、 優(やさ) しさをくれて
[01:02.645]ありがとう、 側(そば) にいてくれて
[01:06.959]ありがとう、 本当(ほんとう) に 本当にありがとう
[01:14.470]
[01:15.888]数(かぞ) えきれないな
[01:19.627]あなたがいて、あなたが 言って、 笑(わら) ってくれるだけでいいの
[01:30.415]
[01:30.947]帰る場所で待っていてくれるあなたへ
[01:38.620]聞(き)かせたい話(はな)し がこんなに 溢れているから
[01:44.721]退屈(たいくつ) しなくてすみそうだ
[01:48.554]数年先(すうねんさき) の 未来を描(えが) くときには
[01:55.603]君は当(あ) たり 前に 隣(となり) で 笑っていてほしい
[02:02.416]少しのマンネリは 許(ゆる) して
[02:06.366]だからありがとう
[02:10.772]あのね、 本当にありがとう
[02:14.651]
[02:31.546]何億(なんおく) の人、 違う価値観(かちかん) の海を泳(およ)ぐ
[02:40.702]出会(であ)う 事が 人生(じんせい) の 宝物(たからも)の なんだね
[02:51.429]ありがとう、 数(かぞ) えきれないね
[02:59.807]あなたがいて、あなたが 言って、 笑ってくれるだけでいいの
[03:10.888]帰る場所で 待ま っていてくれるあなたへ
[03:18.041]聞かせたい 話し がこんなに 溢れているから
[03:24.696]退屈(たいくつ)しなくてすみそうだ
[03:28.570]一人一人(ひとりひとり)  違う 今を 生(い) きてるから
[03:35.736]無数(むすう) の 網目(あみめ) のような 出会いを 運命(うんめい) と 呼んで
[03:42.472]平凡(へいぼん) な 日々 を 彩(いろど) るよ
[03:46.535]だからありがとう あのね 本当にありがとう
[03:55.494]
[04:13.293]帰る 場所で 待っていてくれるあなたへ
[04:20.067]聞かせたい 話し がこんなに 溢れているから
[04:26.924]退屈(たいくつ) しなくてすみそうだ
[04:31.005]数年先(すうねんさき) の 未来を 描(えが) くときには
[04:38.055]君は 当(あ) たり 前に 隣(となり) で 笑っていてほしい
[04:44.683]少しのマンネリは 許(ゆる) して
[04:48.524]だからありがとう
[04:53.175]あのね、 本当に
[04:55.306]いつも 本当に、あのね、 本当にありがとう
[05:03.901]

和楽器バンド – 蛍火 LRC 歌詞

[00:01.735]蛍火
[00:04.868]
[00:09.077]作詞:町屋
[00:11.667]作曲:町屋
[00:24.811]
[00:26.120]明滅スル灯火ユラリ
[00:30.225]囁ク声
[00:34.876]光ト影トガ静カニ
[00:41.197]混ザリ合ウ
[00:43.120]
[00:45.152]咲き乱れる炎
[00:48.739]闇を染め上げた
[00:53.154]それは高く立ち登り
[00:58.784]全てを焼き払う赤
[01:04.479]
[01:05.170]積み上げた過去の日々
[01:09.328]繋ぎ止めた想い出たち
[01:13.648]瞬きに投げ入れた
[01:17.770]戻らぬ様に、戻れぬ様に
[01:22.534]
[01:48.170]鬼サン此方ヘ
[01:52.378]手ノ鳴ル方ヘ
[01:56.520]明滅スル灯火ユラリ
[02:00.859]引キ摺リ出ス陰
[02:05.123]
[02:06.774]背を向けたら
[02:09.474]もう此処には帰れない
[02:14.963]人はどうして
[02:18.241]深淵に心を惹かれてくのか
[02:26.376]
[02:27.083]地に巣食う彼の黄泉は
[02:31.238]暮れの六ツで浮かび上がる
[02:35.526]誰そ彼と振り返るなら
[02:39.576]深い闇が口を開いてる
[02:44.488]
[03:23.574]積み上げた過去の日々
[03:27.748]繋ぎ止めた想い出たち
[03:31.929]瞬きに投げ入れた
[03:36.102]戻らぬ様に、戻れぬ様に
[03:40.589]遥か遠く永い日々
[03:44.599]繰り返した争いの傷
[03:48.994]幾つもの想い重ね
[03:52.919]見据える先、光る夕星
[03:57.963]