タイマー処理

Nodejsでタイマー処理を行う方法について説明します。
まずは以下のスクリプトを見てください。

const MAX_COUNTER = 3;

setTimeout(dosing_notify, 5000, '朝');
setTimeout(dosing_notify, 10000, '昼');
setTimeout(dosing_notify, 15000, '夜');

function dosing_notify(timing) {
 var counter = 0;
 var message = timing + 'のお薬の時間です';
 console.log(message);
 setTimeout(dosing_remind, 1000, timing, counter);
}

function dosing_remind(timing, counter) {
 if(++counter > MAX_COUNTER) {
  console.log('回数オーバー');
  return;
 }
 message = timing + 'のお薬を飲んでください';
 console.log(message + '(' + counter + '回目)');
 setTimeout(dosing_remind, 1000, timing, counter);
}
リスト1.タイマーサンプルスクリプト

これは,5秒後,10秒後,15秒後にそれぞれ朝,昼,夜のお薬の服用を知らせるメッセージを出力するサンプルスクリプトです。関数dosing_notifyでメッセージを出力しています。
setTimeout(dosing_notify, 5000, '朝');
は,引数に'朝'を設定して5秒後に関数dosing_notifyを呼び出しなさいという意味です。
ただし,コンソールにメッセージが出るだけで,Google Homeに喋らせる部分は含まれていません。

お薬の服用を知らせるメッセージが届いたら,1秒おきに催促のメッセージを3回出力します。それをやっているのがdosing_notify内にある
setTimeout(dosing_remind, 1000, timing, counter);
です。引数にtimingとcounterを設定して1秒後に関数dosing_remindを呼び出しなさいという意味です。

関数dosing_remindではcounterを1upして,既定の回数(ここでは3回)を超えたら「回数オーバー」と出力します。超えなかったら薬の服用の催促メッセージとその出力回数をコンソールに出力し,1秒後にdosing_remindが起動するように設定します。

実行結果を以下に示します。
semi2017kumw@semi2017ehr:~/calendar/sample$ node timer-sample.js
朝のお薬の時間です
朝のお薬を飲んでください(1回目)
朝のお薬を飲んでください(2回目)
朝のお薬を飲んでください(3回目)
回数オーバー
昼のお薬の時間です
昼のお薬を飲んでください(1回目)
昼のお薬を飲んでください(2回目)
昼のお薬を飲んでください(3回目)
回数オーバー
夜のお薬の時間です
夜のお薬を飲んでください(1回目)
夜のお薬を飲んでください(2回目)
夜のお薬を飲んでください(3回目)
回数オーバー
semi2017kumw@semi2017ehr:~/calendar/sample$
リスト2.サンプルスクリプトの実行結果

このようにこのサンプルプログラムでは下図に示す流れをシミュレートできます。

図1.服用通知と催促

0 件のコメント:

コメントを投稿