大晦日ということで、ちょっとしたお遊びです。
コンソールにカウントダウンを表示するサンプルです。
さっそく、サンプルです。
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です。
以下の記事でも紹介していますので割愛します。
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); } }
これで、カウントダウンができました。
簡単ですが以上です。