【SALZ製作日誌】2020.02.28~コールバック地獄からの脱出~
長い長い道のりでした。
ようやく、プログラムのメドがついていました。
正直、JavaScriptをナメていました。
スクリプトという名前にお気楽さを感じていましたが、いざプログラムを組んでみると、思い通りに実行されない、掴み所のない得体の知れないものだったのです。
結論から言うと、2つの誤りをしていたために、問題の解決が遅れました。
ひとつ目は、IFTTTで飛ばしたログがプログラムの流れでは説明のつかない順序で表示されていました。
February 22, 2020 at 08:51AM (0:ST_START) [onconnect]
February 22, 2020 at 08:51AM (2:ST_START) [湿度計] HP 48.6
February 22, 2020 at 08:51AM (1:ST_START) [温度計] TP 16.9
February 22, 2020 at 09:06AM (3:ST_START) [onclose]
February 22, 2020 at 09:06AM (4:ST_START) [onconnect]
February 22, 2020 at 09:06AM (6:ST_START) [湿度計] HP 51.4
February 22, 2020 at 09:06AM (5:ST_START) [温度計] TP 16.2
February 22, 2020 at 09:51AM (7:ST_START) [水分計] WL 1.373
February 22, 2020 at 10:13AM (8:ST_START) [onclose]
February 22, 2020 at 10:13AM (9:ST_START) [onconnect]
February 22, 2020 at 10:13AM (11:ST_START) [湿度計] HP 52.6
February 22, 2020 at 10:13AM (10:ST_START) [温度計] TP 16.5
console.log()の順序と異なっていることに気付くまでに、長い時間が掛かりました。
ふたつ目は、JavaScriptのコールバック関数を理解しないまま、書き散らかしていたため、説明できない挙動をしていました。
元々Webページをスマートに制御するために作られたJavaScriptは通信遅延を考慮した非同期処理がウリで、処理はするが、結果を待たない作りであること。
関数を変数に代入することができ、関数をコールバック関数として、引き渡すことをよく行われていること。
このようなことから、JavaSceiptのプログラムは上から下へ順番に処理されるものではなく、注意深くコードを見てやらなければならないものであることがわかりました。
「コールバック地獄」という言葉もあるようで、まさに、これだなと思いました。
これは手強い。きちんと勉強しなければ。
という事で「改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで」で勉強しました。
この本もなかなか高度な内容でしたが、必要な所をしっかり取り込めました。
で、自分のコードを見直してみると、なるほど納得。意図しない作りであることがわかりました。
うちのObnizはよく接続が途切れます。数時間に一回の割合なのですが、その都度、onconnect()が呼ばれます。その度に、タイマー関数を定義していたため、一時間に一回のチェックが、時間が経つにつれ、どんどん増殖していました。
サンプルプログラムは短時間用のものが多いので、onconnect()で問題ないこともわかりました。
もう1つ、解決した問題がありました。給水時、ログを見ると必ず1分でモーターが停止していました。引数には10分を入れているのですが、指定した時間働いてくれません。
Obniz.jsを覗いてみると、wait()が1分でトリミングされていることがわかりました。
ようやくメドがついたように見えたプログラムでしたが、まだまだ不可解な挙動が見受けられます。
モーターを動かしていると、1分で接続が切れるのです。これがまた、理由がわかりません。
これはまた今後の課題です。
この記事が気に入ったらサポートをしてみませんか?