JavaScript 学習実施メモ 5
初学者のメモです。間違い等ありましたらご指摘コメント待ってます。
5回目。ストックがなくなれば、溜まったら出す形式で。
前回: https://zenn.dev/yuki_kanayama/articles/3c37943989b79d
初回: https://zenn.dev/yuki_kanayama/articles/37022f0373e38d
Promise
非同期処理をより簡単に、可読性が上がるように記述できるようにしたもの。
1. // resolve の場合は then が実行される。
2. new Promise(function (resolve, reject) {
3. resolve("hello!");
4. }).then(function (data) {
5. console.log(data); // -> "hello"
6. }).catch(
7.
8. ).finally(function () {
9. console.log("終了処理");
10. });
11.
12. // reject の場合は catch が実行される。
13. new Promise(function (resolve, reject) {
14. reject("bye!");
15. }).then(
16. ).catch(function (data) {
17. console.log(data); // -> "bye!"
18. }).finally(function () {
19. console.log("終了処理");
20. });
1. new Promise(
2. 同期処理
3. ).then(
4. 非同期処理(resolveを待つ)
5. ).catch(
6. 非同期処理(rejectを待つ)
7.
8. ).finally(
9. 非同期処理(then、またはcatchを待つ)
10. );
Promiseチェーン
1. function sleep(val) {
2. return new Promise((resolve) => {
3. setTimeout(() => {
4. console.log(val++);
5. resolve(val);
6. }, 1000);
7. });
8. }
9.
10. sleep(0)
11. .then(function (val) {
12. return sleep(val);
13. })
14. .then(function (val) {
15. return sleep(val); // sleep(val)が実行 => Promiseのインスタンスが return される。それがさらにreturnされることでチェーンがつながる。
16. })
17. .then(function (val) {
18. return sleep(val);
19. })
20. .then(function (val) {
21. return sleep(val);
22. })
23.
24. // アロー関数を使用する場合
25. sleep(0)
26. .then(val => sleep(val))
27. .then(val => sleep(val))
28. .then(val => sleep(val))
29. .then(val => sleep(val))
30. .then(val => sleep(val))
31. .then(val => sleep(val))
Promiseと並列処理
allメソッド
Promiseの並列処理を実行するメソッド。引数に反復可能オブジェクト(Arrayなど)でPromiseのインスタンスを記述する。中の処理が全て完了したときに次の処理に以降する。
raceメソッド
配列で渡された最初のインスタンスが完了したら、次の処理を実行する。
allSettlledメソッド
allの違いは、rejectが呼ばれるとcatchに処理が移行するが、allSettledはthenしか呼ばれない。
マクロタスクとマイクロタスク
マクロタスク
これまでのレクチャーでタスクキューと呼んでいたもの。順番が回ってきたら1つずつタスクを実行する。
例:
setTimeout
setInterval
requestAnimateonFrame
など
マイクロタスク
タスクキューとは別で存在する非同期処理の待ち行列。別名:ジョブキュー順番が回ってきたらすべてのジョブを実行する。
例:
Promises
queueMicrotask
MutationObserver
など
Await / Async
Promiseをさらに直感的に記述できるようにしたもの。
Async
Promiseを返却する関数の宣言を行う。宣言した関数に return の記述がなくてもPromiseの空インスタンスを返す。
Await
Promiseを返却する関数の非同期処理が完了するまで待つ。
例:
1. function sleep(val) {
2. return new Promise(function(resolve) {
3. setTimeout(function() {
4. console.log(val++);
5. resolve(val);
6. }, 1000);
7. });
8. }
9.
10. async function init() { // async がないとエラー
11. let val = await sleep(0); // resolve が渡す引数を変数に代入する。
12. val = await sleep(val); // 受け取った引数を再代入しもう一度実行。
13. val = await sleep(val);
14. val = await sleep(val);
15. val = await sleep(val);
16. val = await sleep(val);
17. return (val); // then が実行
18. throw new Error(); // catch が実行
19. };
20.
21. init().then(val => {
22. console.log('then: ' + val);
23. }).catch(() => {
24. console.log('catch');
25. })
1. 実行結果
2. 0
3. 1
4. 2
5. 3
6. 4
7. 5
8. then: 6
fetch
サーバーからデータを取得したりすることができる関数。返ってくる値はPromiseのインスタンス。よって thenメソッド が使える。
jsonファイル
Javascriptからサーバー上にデーターを取得するとき、サーバーに対してデータをリクエストする時に使用する。Javascriptの記述形式に似ている。主に3つの違いがある。
- シングルコーテーションが使えない。
- プロパティをダブルコーテーションで囲む必要がある。
- 最後の要素にカンマをつけるとエラーになる。
1. fetch('users.json')
2. .then((val) => {
3. // console.log(val);
4. return val.json();
5. })
6. .then((json) => {
7. console.log(json);
8. for (const user of json) {
9. console.log(`I am ${user.name}, ${user.age} years old!`)
10. }
11. })
12.
13. // Async / Await を使用する場合
14. async function fetchUsers() {
15. let val = await fetch('users.json');
16. let json = await val.json();
17. for (const user of json) {
18. console.log(`I am ${user.name}, ${user.age} years old!`);
19. }
20. }
21. fetchUsers();
例外処理とエラー
例外処理
エラーが発生した際に飛ぶ特別な処理。
1. try {
2. throw new Error()
3. } cache(e) {
4. エラーハンドリング
5. } finally {
6.
ES ModulesとCommonJS
モジュール
ソースコードを機能毎に分割して、メンテナンスしやすくする仕組み。代表的なものにESM(ESモジュール)とCJS(Common JS)がある。
Common JS
Node.jsのモジュール管理システム。require / exports を使用する。
ES モジュール
ECMAScript の使用に基づいたモジュール管理システム。主にブラウザ側で使用する。import / export を使用する。
主な違い
1. ESM vs. CJS
2. import/export require/exports
3. ブラウザ Node.js
4. .mjs .cjs
ESModuleと即時関数
モジュールコンテキスト
ほとんど、グローバルコンテキストと同じ。ただ、モジュールコンテキストは、this が使えない。(Windowを参照しない)
モジュールスコープ
モジュール間(ファイル間)でのスコープ。export / import を使用しないと変数を参照できない。
モジュールの特徴
モジュールの動き
モジュールは、読み込みが非同期処理で行われる。よって、HTMLの構文解析が完了してから実行される。また、HTML側で同じモジュールを複数回読み込む、または、import で複数回読み込んでも一度しか実行されない。
nomodule
1. <script nomodule>alert('表示したいテキスト') </script>
このように記述することで、モジュールに対応していないブラウザ(IEなど)でアラート表示することができる。
Discussion