同期処理とは, プログラムを上から下へ順番に処理することです(同期処理1→同期処理2→同期処理3→同期処理4)。もし同期処理2が終わらない場合, 同期処理2が終わるまで同期処理3と4は処理されないのです。
非同期処理は, プログラムが実行された時に(待たないで), 次のプログラムを処理することです。
Promiseオブジェクトは簡潔に言えばいわば「今は価を返せないが, いつか値を返すという約束をする」オブジェクトです。
Promiseオブジェクトは3つの状態(pending, fulfilled, rejected)を持っています。
pendingは保留しているという意味で, まだ非同期処理は成功も失敗もしていません。
fulfilledは達成したという意味で, 非同期処理が成功したことを示します。
rejectedは拒否したという意味で, 非同期処理が失敗したことを示します。
初期値はpendingで, 一度でもfulfilledまたはrejectedになったらそれ以降は状態も非同期処理が終了した時に返す値もずっとこのままです。
Promiseのコンストラクターは2つの関数(resolve, reject)を引数に取ります。
第1引数である関数(resolve)に引数を渡して実行した場合は, 状態がfulfilledになります。
第2引数である関数(reject)に引数を渡して実行した場合は, 状態がrejectedになります。
引数の値はいずれもPromiseオブジェクトが保持する値になります。
resolveとrejectは関数だよ!
fulfilledとrejectedは状態だよ!
ここ重要!
then()は2つの関数を引数に取ります。
Promiseの状態がfulfilledになった場合は第1の関数を, Promiseの状態がrejectedになった場合は第2の関数を引数に取ります。
成功した(状態がfulfilled)場合はthen関数を実行します。
失敗した(状態がrejected)場合はcatch関数を実行します。
promise.allはpromiseが全てresolveされた時に.thenを実行します。
逆にpromiseが1つでもrejectされた場合は.catchを実行します。