待機とループ

obnizデバイスに対して一定時間作業を停止させることができます。これにより接続してあるセンサーの処理をまったりすることができます。wait()関数ではデバイスに対してミリ秒で待機を指示し、同時に動作させている側のプログラムも同じだけ待機させます。

led.on();
await obniz.wait(1000); // led ON for 1sec.
led.off();

awaitを省くことでデバイスにだけ待機の指示を送り、プログラム側は動作を続けることができます。

var time = new Date();
led.on();
obniz.wait(1000); // led ON 1sec.
led.off();
console.log((new Date()).getTime() - time.getTime()) // 0 or very few ms. not 1000ms.

繰り返し

プログラムの中でループなど繰り返し何らかの処理を行う場合、以下の注意点があります

  • デバイスとの接続が切断されたらループを抜ける
  • スレッドが固まらないようにする

最も安全なループは以下のようになります。

while(obniz.connectionState === 'connected') {
  try {
    // 何か繰り返しやりたい作業をここに記載
    await obniz.pingWait(); // 通信を確認
  } catch(e) {
    // break or throw a error
  }
}

connectionStateはデバイスとの接続状態を表します。これが接続中の限り繰り返すようにします。
pingWait()はデバイスにデータを送りそれが帰ってくるまで待機する関数です。通信の確認とともにスレッドがフリーズしないようにし、かつデータが詰まったりしないように通信路を保つことができます。

ただし、pingWait()の場合応答まで待ちますので、デバイスとの距離が遠いほど時間がかかってしまいます(例. 日本とアメリカなら100msec以上)。そこで、setTimeout()を利用したり、単純にwait()関数を入れる方が高速にループ処理を行えます。この場合大量のデータを送るとデバイスが受け止めきれず通信路に溜まってしまう場合があるため注意が必要です。

while(obniz.connectionState === 'connected') {
  try {
    // 何か繰り返しやりたい作業をここに記載
    await obniz.wait(1);
  } catch(e) {
    // break or throw a error
  }
}