Twitterにて、「エンジニアにとってAPIと非同期処理は要にして難関」というツイートをみたのでまず非同期処理について調べたことをど初心者ながらまとめたいと思います。
非同期処理の前に、非ではない***同期処理とは?***というところを書きます
同期処理
- プログラムが記述された通りに実行されるもの
- 1行のプログラムに時間がかかったら全体が重くなる
- その処理の1つに時間のかかる処理があると、その実行が完了するまで、次の行には進まない
なんでかとういうとJavaScriptはシングルスレッドで動いているから!
JavaScriptは一度に一つの仕事しかできない、私みたいなマルチタスク苦手マンらしいです
#非同期処理について
(例となるコードを書かずに日本語で私の理解している感じで書いてみます)
-
コードは上から順番に実行されるので、途中に「5秒後にやる(完了する)」みたいなコードを書くと、その下のコードは5秒後に実行されてしまい、そうすると全体的に実行速度が遅くなってしまいます。
-
しかし、callback関数のように、「5秒後にこれやっとって!私先行くわ!」とそのコードの実行が完了するのを待たず、すっ飛ばして次のコードを実行し、すっ飛ばされたものが実行完了したらそこのコードを実行させる、せっかち母ちゃんだと捉えています
(間違ってたら教えてください)
非同期処理について感覚的に理解したい方は私の記事なんか読まずこちらのサイトをお読みになった方が単純明快でわかりやすいと思いますので是非みてみてください
私の掴んだイメージ
(このサイトを読んで)
-
同期処理
- 与えられた仕事を言われた通りにやる、(というかそれしかできない)
-
非同期処理
- 言われなくても自分からできる仕事はないか探して実行する
なんかどっかで聞いたことのある響きですね
Callback関数とは
こちらのサイト(わかりやすかったです)によると、
- 別の関数に呼び出してもらうための関数
- 高階関数に渡すための関数
- 他の関数に引数として渡す関数のこと
- 「ある関数が呼び出された時、戻り値として、本来渡したい結果を返すのではなく、一度関数としては終了し(=呼び出し元に戻る)、あとで『本来渡したかった値』を返せる状態になった時に、呼び出し元にその値を通知する」仕組み
ということです。
コールバックの問題点
- 複雑な処理になると、途端にわかりにくくなるということ
▶︎読みやすく書くためには、同期的に書く!
- ネストが入れこいにならない
- 上から下に読んで実行フローが把握できる
- 非同期処理の結果得られた値を次の処理に引き回せる。
- try/catchで素直に例外を捕捉できる
同期的に書く代表的な方法は
- Promiseを使う方法
- Generatorを使う方法
がある
Promiseについて
こちらのサイトによると、Promiseは
-
ES2015(ES6)から追加仕様として加わった
-
3つの状態(resolve, reject, done)を持つ
という特徴がある。
-
promiseの基本的な考え方は、非同期的に動作する関数は、本来返したい戻り値の代わりに、『プロミスオブジェクト』という特別なオブジェクトを返しておき、(本来返したい)値を渡せる状態になったら、そのプロミスオブジェクトを通して、呼び出し元に戻す」というもの
-
非同期処理の成功や失敗を受け取り、処理を行うことができる
-
非同期処理の最終的な完了もしくは失敗を表すオブジェクト。
-
JavaScriptやNode.jsにおいて、非同期処理のコールバック関数をエレガントに記述するための仕組み
Promiseのメリット
- コールバック地獄を回避できる
- 時間のかかるAPIから取得した値を次の処理に渡せる
- 上から順に実行されるので可読性が上がる
また追加で調べたことがあれば、追記していきます!
JavaScriptの「コールバック関数」とは一体なんなのか