
みなさんこんにちは! ガノー(Ganohr)です! (≧▽≦)
‘JavaScript’でプログラミングを行っていると、どうしても避けて通れないのが非同期処理です。
非同期通信などが必要になる局面も多く、今後一層さけて通れなくなります。
しかし、JavaScriptで実際に非同期処理を実現するための「Promise」や「async/await」の解説は、実際に動かして理解できるようなサンプルがほとんど存在しないことに気が付きました。
ほとんどどが呼び出し方のサンプルだけに留まっており、あまり初心者向けにはなっていないのです。初心者向けとしては、実際に動かして確認できる方がサンプルとして適切です。
そこで本記事では、「実際に動かして動作を確認できるコード」を公開し、解説します。
【本記事で学べる内容】
- JavaScriptのPromiseの基本がわかる
- JavaScriptのasync/awaitの基本がわかる
- JavaScriptのPromsieとasync/awaitの対応、その違いがわかる
- JavaScriptのPromiseとasync/awaitを用いて、実際に操作して学べるサンプルと解説がある
更新履歴
目次
- 1.JavaScriptのPromiseとは?
- 1.1.JavaScriptのPromiseはメソッドチェーンで記述する
- 1.2.JavaScriptのPromiseは成功時にresolveメソッドを実行し、失敗時にrejectメソッドを実行する
- 1.3.JavaScriptのPromiseは定義時即座に実行される
- 2.JavaScriptのasync/awaitとは?
- 2.1.JavaScriptのasyncとは?
- 2.2.JavaScriptのawaitとは?
- 3.まとめ:JavaScriptのasync/awaitとPromiseの関係
- 4.JavaScriptのPromiseやasync/awaitを用いたサンプルコード
- 4.1.ダウンロード
- 4.2.サンプルコードの挙動
- 4.3.サンプルコードの構造
- 5.JavaScriptのPromiseやasync/awaitを用いたサンプルコード - HTML
- 5.1.promise-sample.html
- 5.2.async-await-sample.html
- 6.JavaScriptのPromiseやasync/awaitを用いたサンプルコード - CSS/master.css
- 7.JavaScriptのPromiseやasync/awaitを用いたサンプルコード - JavaScript
- 7.1.共通部
- 7.1.1.js/jquery-3.5.1.js
- 7.1.2.js/base.js
- 7.1.3.js/stub.js
- 7.2.個別部
- 7.2.1.js/promise-sample.js
- 7.2.2.js/async-await-sample.js
- 8.最後に
JavaScriptのPromiseとは?

JavaScriptの‘Promise’(プロミス、約束の意味)とは、非同期処理を実現するための機能です。
以下、私が寄稿した記事から引用しておきます。
JavaScriptのPromiseとは?入門用に分かりやすく解説! Capa.inc - Promiseとは?
Promise(プロミス)とは、JavaScriptで非同期処理を実現するための機能です。端的に言えば、Promiseは日本語で「約束事」と訳されるように、「非同期処理を記述する際の決まり事」です。この決まり事を実現するために、Promiseオブジェクトを生成し、そのオブジェクトを介して非同期処理や同期処理を実現します。
また現在Internet Explorerを除くPC/スマートフォンのほとんど全てのモダンブラウザで基本的な機能が動作する点もPromiseの特徴といえます。
非同期処理を「Promiseオブジェクト」を用いて、決まり事を守りながら実現します。Promiseオブジェクトとは、new Promise(() => {~})
といった風に生成したものです。
この際のPromiseオブジェクトの決まりごとは、以下の3つに集約されます。
【Promiseの3つの決まりごと】
- JavaScriptのPromiseはメソッドチェーンで記述する
- JavaScriptのPromiseは成功時にresolveメソッドを実行し、失敗時にrejectメソッドを実行する
- JavaScriptのPromiseは定義時即座に実行される
JavaScriptのPromiseはメソッドチェーンで記述する

JavaScriptのPromiseを用いた非同期処理の記述は、メソッドチェーンを用いて行います。
メソッドチェーンとは、処理を連続して同じインスタンスで継続していく際に、インスタンスの指定を省略できる記法です。
もしもメソッドチェーンというものに聞き覚えがない場合、別言語(C#)ではあるものの、解説記事があるため読んでみると良いでしょう。

Promiseでは、処理成功後の処理をthen
メソッドで、処理失敗時の処理(例外処理)をcatch
メソッドで定義します。それぞれメソッドチェーンにより、繋げていくことで非同期処理の逐次処理を記述します。
メソッドチェーンを用いているため、いちいち非同期処理を行うインスタンスを指定する必要はありません。
JavaScriptのPromiseは成功時にresolveメソッドを実行し、失敗時にrejectメソッドを実行する

Promiseでは処理内部から引数で指定されたresolve
(リゾルブ、解決)メソッドやreject
(リジェクト、拒否)メソッドを呼び出すことで、処理を記述します。
この時resolve
した場合then
メソッドで処理し、reject
した場合catch
メソッドで処理(例外処理)していきます。
この対応をもとに、以下の引用コードをご覧ください。
JavaScriptのPromiseとは?入門用に分かりやすく解説! - Promiseの基本1 – 非同期処理の定義
// 処理1をp1として定義 const p1 = new Promise((resolve, reject)=>{ // : 何らかの処理 resolve(“resolved!”); // 成功ならresolve関数を実行 /* reject(“rejected!”); // 失敗ならreject関数を実行 */ }); // 処理2をp2として定義 const p2 = new Promise(resolve=>{ // 何らかの処理を実施 // 失敗時に処理が不要ならrejectを省略可能 resolve(“resolved!”); }); // p1とp2の完了を待つ Promise.all([p1,p2]).then(()=>{ // p1とp2完了後の処理を記述 return new Promise(resolve=>{ // 何らかの処理を実施 resolve(“resolved!”); }); });
ただし、Promiseでは複数の同期すべきオブジェクトがある場合に、メソッドチェーンのネストが問題となってしまいます。
JavaScriptのPromiseとは?入門用に分かりやすく解説! Capa.inc - Promiseの基本2 – 同期処理の定義
次に注目してほしいのがthen関数の戻り値が「return new Promise(~)」となっている点です。この記述を行うことで「then関数のネストが解消されている」点が重要です。
ここでいう「then関数のネスト」とは、以下のような記述方法です。
new Promise((resolve, reject)=>{ resolve("A resolved!"); }).then(()=>{ new Promise(resolve=>{ resolve("B resolved!"); }).then(()=>{ new Promise(resolve=>{ resolve("C resolved!"); }) }) });
これでは同期する処理が増えれば増えるほどネストが深くなっていき、コーディングの手間が増えてしまいます。また、ネストの深さが処理によって変わってしまうため、処理の順序を後から入れ替えることが難しくなってしまいます。
JavaScriptのPromiseは定義時即座に実行される

Promiseオブジェクトは生成時点に処理を定義しますが、その時点で処理が開始される点を忘れてはなりません。
要は、いちいち、start
やrun
といったメソッドを呼び出す必要がないのです(そしてそのようなメソッドはありません)。
そもそも「開始タイミングを厳密に同期する必要性」は、基本的にありません。
しかし、実際に操作して動作するサンプルコードを作るうえでは、この制限への対処が必要です。そのため、そうしたコードが必要だといった無用な誤解を招かないよう、この前提を明示しました。
具体的にはPromiseに指定する処理内部からsetTimeout(~)
を利用して、処理が継続するように定義していますが、それはサンプル用であるという前提を持っておくと理解しやすいでしょう。
JavaScriptのasync/awaitとは?

JavaScriptの‘async’(アシンク、アシンクロナイズド・asynchronizedの略、非同期の意味)や‘await’(アウェイト、待つの意味)は、Promiseをベースにより簡便な記述が可能な記述であり、ES2016より使用できます。
async function getX() {
return 1;
}
async function getY() {
throw "error";
}
async function main() {
try {
let x = await getX();
console.log("x:" + x);
let y = await getY();
console.log("y:" + y);
} catch(err) {
console.log("err:" + err);
}
}
//x:1
//err:error
JavaScriptのasyncとは?
async
は「非同期処理を行う関数定義」と、「非同期処理を呼び出す関数定義」それぞれに付与するキーワードです。
async指定された関数は、まず戻り値としてPromiseオブジェクトを返却します。そのPromiseオブジェクト内部には、関数の内容が格納されており、即時実行されます。
この時、return
された値がresolve
されたものとして処理され、throw "エラーメッセージ"
にて例外を投げるとそのメッセージがreject
されたものとして処理されます。
要は、
async
キーワードは、関数をPromise化する機能であると言えます。なお、async
が指定された関数の戻り値をPromiseオブジェクトにすることもできます。なぜならPromsieオブジェクトはPromsieオブジェクトが入れ子になっていても、問題なく処理できるからです。
JavaScriptのawaitとは?
await
はasync指定された関数呼び出しの直前に指定するキーワードです。
awaitが指定された際の動作は、まず関数が完了(resolve)するまで待機し、完了時の値(resolveされた値)をセットします。
まとめ:JavaScriptのasync/awaitとPromiseの関係

またasync
指定された関数に対してawait
キーワードを使わずにアクセスした場合、Promsieオブジェクトが返却されます。
async function getA(){return 1}
async function getB(){return new Promise(resolve=>resolve(2))}
console.log(getA() instanceof Promise); // true
console.log(getB() instanceof Promise); // true
let a = getA(), b = await getB();
console.log(a); // Promise {<fulfilled>: 1}
console.log(b); // 2
この動作を紐解くと、JavaScriptのPromiseとasync/awaitの関係が見えてくるでしょう。
【JavaScriptのPromiseと、async/awaitの関係は?】
- Promise → 非同期処理を実現するための機能である
- async → 関数をPromiseオブジェクト化する機能である
- await → Promiseオブジェクトがresolveされるのを待ち、実際に値を取り出す機能である
さて、次ページに実際に動かして学べるサンプルコードを用意しました。こちらはダウンロードも可能になっています。
WordPressの不具合対応/カスタマイズ¥15,000~
PC歴25年超、SE歴10年超、WordPress運営歴7年超、WordPressエンジニア歴5年超のスキルとノウハウを提供します
当サイト管理人の「ガノー」(Ganohr)は、日本最大手且つ東証一部上場企業が運営するクラウドソーシングサイト『Lancers』にて、認定ランサーとして活動しています。
※ 認定ランサーとはLancersにより様々な能力 ( 高い仕事遂行率・高い顧客満足度・多くの実績、など ) を評価したプロフェッショナルを認定する制度です。
JavaScriptカテゴリの最新記事
- 2023.04.26
- JavaScript, ユーザビリティ, 必須, 開発者向け,
サイト内で公開しているオリジナルソフトを、Edge経由でダウンロードできなくする方法
- 2023.04.03
- JavaScript, 開発者向け,
JavaScriptで日付や日時関連のサンプルコード一覧完全版
- 2023.02.27
- AdSense, JavaScript, jQuery, ユーザビリティ, 広告収益等,
Googleアドセンスのワイドスクリーン用アンカー広告の表示状態に応じてトップへスクロールするボタンの位置を調整する
- 2023.02.17
- JavaScript, PHP, 必須, 開発者向け,
条件文・条件式の論理和と論理積と論理否定を分かりやすく解説!コーディングスタイルも解説
- 2023.02.17
- JavaScript, ユーザビリティ, 必須, 開発者向け,
highlight.jsで半角スペースが で記述されている場合に自動的に半角スペースへ置換させる
- 2022.11.23
Chrome/EDGE等のChromiumブラウザのバグによる文字崩れ/文字のにじみ/文字壊れの原因と改善するコードを共有します
コメントを書く