Node jsで始めるfilesystem7 async await

javascript

promiseについて解説しましたがpromiseもthenによるメソッドチェーンを重ねる度に見通しが悪くなってきます。慣れてくるともっと見易くならないかと思うはずです。

メソッドチェーンを何重にも繋いで見づらくなってきました。これを同期処理っぽく書いてみます。

async await

async 、await は非同期処理を同期処理のように書く糖衣構文である。同期処理と見た目を変えずに書けるためコードの見た目がすっきりします。ちなみに先ほどのコードをasync awaitで書き直すとこんな感じに。

メソッドチェーンが無くなってすっきりしました。async awaitは基本非同期処理を関数で囲います。関数の頭、もしくはアロー関数の場合引数の手前にasyncと書いて関数内のpromiseを返す関数の頭にawaitと加えて実行することで非同期処理を同期処理のようにかけます。

しかしこのasync、具体的に何を実行しているのか?実はこのasync、関数内をpromiseで包んでreturnで返した値をresolveした値として返します。

関数funcはnumber型の値を返す同期的な関数です。しかしasyncと付け加えてpromise化する事によりthenでのチェーンメソッドで結果を受け取っています。

両関数共にresolveされたnumber型の値の同じ結果を返す関数。関数内に非同期処理自体無いのでpromiseを通す意味は特にないですが、、。ただしasync関数の中の非同期処理は結局promiseを通さないと適切な処理を行ってくれない。asyncはあくまでreturnの値をpromiseのresolveとして返すだけである。

async,awaitの本来の使用方法に戻るとasync関数内で非同期関数をawaitを頭に加えて非同期関数を同期関数のように扱える。awaitで加えられた関数群は上から下に順番に処理をしてゆく。ただしawaitの関数はそれ自体がpromise を返す関数でないと機能しない。なのでデフォルトでpromiseを返さない非同期処理は関数としてpromiseで囲む必要がある。

それではasync関数内でasync関数を呼び出せる事は可能でしょうか?その場合のpromiseは?思い出してください。async関数内のreturnはpromiseのresolveとして値を返します。つまりasync関数内に非同期処理が無かったとしてもそれ自体が形式上は非同期処理になるのです。なのでasync関数内でasync関数を呼び出す場合は他のpromise関数同様awaitを加えます。

非同期の関数を使いまわしたり関数ごとに処理を分けるとこういった非同期関数内で非同期関数を呼び出すことも多くなるでしょう。ややこしいですがasync awaitは非同期処理を使いこなす上で強力な武器になります。これが使えるようになれば一歩進んだExtensionが開発できる、、、はず。

Beer 寄付してサイトを応援する。