Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

11.3.2 非同期処理

物理デバイスの応答にせよ、ネットワーク通信にせよ、結果が返ってくるまでには時間がかかります。その間、ブラウザやNode.jsを止めてしまうわけにはいきません。だからCHIRIMENのコードは、応答を待つ処理を非同期処理として書きます。

本チュートリアルではこれを async 関数 で記述しています。async 関数による非同期処理に慣れていない人は、こちらの資料「非同期処理 (async await 版)」 も参考にしてください。非同期処理についてより詳しくは JS Primer の非同期処理説明ページ をご覧ください。

非同期処理は、本来ならそれなりに難しい概念です。ですが本チュートリアルの範囲では、次の2つのルールさえ守ればコードは書けます:

  • 非同期関数の呼び出し時には前に await を付けて呼び出す
    • 非同期関数呼び出し前に await を付けると、その処理の完了を待ってから次のコードが実行されます
    • GPIO/I2C の初期化、ポートの設定などは非同期処理なので await キーワードを付けて呼び出します
  • 非同期処理を含む関数は前に async を付けて非同期関数として定義する
    • async function 関数名() { ... } のように頭に async を付けるだけで非同期関数になります

この2つを守らないとどうなるでしょうか。await なしで非同期関数を呼び出すと、返ってくるのは処理結果ではなく Promise オブジェクトです。コードの見た目は上から下へ素直に進んでいるのに、実行順序はそのとおりにはなりません。たとえばポートの初期化を await なしで呼んでしまうと、初期化が終わる前に次の行が動き出し、まだ使えないハードウェアを操作しようとして失敗する、といったことが起こります。

ハードウェアを制御する処理は必ず非同期で呼び出し、その処理を含む関数もまた非同期にする。この一点さえ決めておけば、コードの実行順序は上から下に見たとおりに進み、読み書きに迷うことはありません。