なんだかGoodVibes

日々の勉強メモです。

【Node】コンソールでカウントダウン

晦日ということで、ちょっとしたお遊びです。
コンソールにカウントダウンを表示するサンプルです。
さっそく、サンプルです。


var readline = require('readline');

function display(num) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            readline.cursorTo(process.stdout, 0, 0);
            console.log(num);
            resolve();
        }, 1000);
    });
}

async function main() {
    console.clear();
    for (var i = 5; i >= 0; i--) {
        await display(i);
    }
}

main();


出力結果は1秒毎にコンソールのx:0、y:0の位置に
カウントダウンを出力します。


では、詳細を見ていきましょう。


全体

今回使用しているsetTimeoutは非同期な動作をします。
出力する順序を制御するためにawait/async
使用して非同期な動作を制御しています。


モジュール

今回使用するのはreadlineです。
以下の記事でも紹介していますので割愛します。

nandakagoodvibes.hatenablog.com


function display(num)

実際の出力処理の関数です。
setTimeoutは第1引数に処理内容、第2引数にミリ秒をしてします。
つまり、第2引数に指定した時間待機して第1引数でしてされた内容を実行します。
実行される処理では、readline.cursorTo(process.stdout, 0, 0)で
カーソルの位置を指定しています。
第2引数でx、第3引数でyの位置を指定できます。

function display(num) {
    return new Promise((resolve, reject) => {
        //  1000ミリ秒後に処理を実行。
        setTimeout(() => {
            // カーソルの位置を(0,0)に設定して上書き
            readline.cursorTo(process.stdout, 0, 0);
            console.log(num);
            resolve();
        }, 1000);
    });
}


async function main()

出力処理の呼び出しもとです。
今回は、5〜0となるよにループを設定しています。
display関数をawaitしているので
Promiseの結果が返ってくるまで処理が待機されます。

async function main() {
    console.clear();
    for (var i = 5; i >= 0; i--) {
        // displayのPromiseの結果を待つ
        await display(i);
    }
}


これで、カウントダウンができました。
簡単ですが以上です。