とにかく自習で気を紛らす。

  • Promise
    • マルチスレッド処理でよく説明される consumer/producer のパターンで理解する。
    • Promise の executor の引数 resolve, reject がそれぞれ前項の onload, onerror に対応する。
    • Primise のメソッドでいちばん基本的かつ重要なのは then() だ。 「消費者」処理を指定する。
      • .catch(f) の指定は .then(null, f) と同値。
    • resolve() 呼び出しは最初の一度しか意味がない。
  • Promises chaining
    • then() が新しい Promise を返すことに注意して、そこにメソッド呼び出しを連鎖するのが急所。
    • then() を実装した Promise 互換なクラスを定義するのもアリ。
    • 非同期処理はつねに Promise を返すのが good practice だ。
    • then() はその結果なりエラーなりを次の then() なり catch() なりに渡す。
  • Error handling with promises
    • チェインのケツで catch() を呼び出すと、どのステップの例外もここで捕捉される。
    • Promise の executor の周りには見えない try ブロックがあると考える。
    • ブラウザーの場合には、Promise が送出した捕捉されなかった例外を扱うイベントハンドラーがある。
  • Promise API: クラスメソッドの紹介。
    • Promise.all() は並行処理を join するイメージでよい。結果からなる配列を返す。 エラーがなにか一つでも発生すると、すべてが無になる。 また、未済処理が中断されるようなことはない。 All or nothing な条件のときに利用するといい。
    • Promise.allSettled() はそのマイルド版。
    • Promise.race(), Promise.any() は一つでいい場合に使う。エラーを確認する場合は前者を使う。
  • Promisification: Promise を返す関数を定義する。
    • もう一度確認するが、コールバックと違って Promise は一度きり。

2:30 疲れたので自習終了。YouTube を観ながら麻雀の練習。

3:20 寝る。

7:30 起床。納豆とおにぎりを食う。PC を開いてダラダラと自習。

  • Microtasks
    • Promise のいつものメソッドは非同期的に呼び出される。
    • Promise の準備ができると、そのハンドラー各種は FIFO キューに入れられるが、実行はまだされない。 現在の実行コードから解放されると、キューからタスクが取り出されて実行される。
  • Async/await
    • async function 宣言された関数は、自動的に中身を Promise に包まれてそれを返す。
    • 何かを await すると、CPU は終了まで他のコードを実行することができるかもしれない。
    • 現代的なブラウザーでは、モジュール最上位レベルでの await がうまく働く。
    • async function 関数にあるむき出しの throw 文は Promise.reject に相当する。
    • 演習問題 1 を VS Code で書くと、この関数は async function にできるのではと指摘される。
    • 演習問題 3 がいちばん易しいが、念のため出題されている。
  • Generators
    • function*, yield, next()
    • どういうわけか [Symbol.iterator]: function*()*[Symbol.iterator]() と書ける。
    • yield* 構文もある。Python の yield from みたいな感じだ。

10:00 PC を閉じて外出。まずはイトーヨーカドー曳舟店で体温チェック。

スカイツリー展望台一階。トイレ。

押上駅~東日本橋駅~小川町駅。万世橋ルート。

11:10 秋葉原 HEY 二階&三階。

イルベロ。ファーストプレイで I/O Error 終了。相変わらず私のツキは細い。

ノスフェラトゥ 2 クレ。2-8 初到達。ボス面。 ハーピーが画面上部を往復するので、上向きにコウモリを飛ばしてダメージを与え続けるのか?

バブルシンフォニー 2 クレ。なぜかアクションコーナーに常駐している。ありがたい。 前回来店時の反省から、少しは先に進めた。色々と忘れていて楽しい。

13:40 退店。なんと雨が降っている。合羽を着て小川町駅まで戻る。

押上駅から地上に出ると雨は少なめになっている。

14:15 曳舟の部屋に戻る。おやつの支度をしながら PC を開く。写真整理。 バブルシンフォニーの絵は殺伐としていなくていい。

15:50 寝るか。

21:30 起床。外出。

21:50 コモディイイダ東向島店。496 円。

  • ベビーカマン (4)
  • 半熟卵冷やしうどん
  • さっくり食パン

曳舟の部屋。排便失敗。入浴。

22:35 風呂終了。PC に戻る。晩飯。卵を割る術がない。 タンス代わりにしているスーツケースの角にぶつける。白身が若干散乱し、ひどいことになる。

  • 【ゆっくり紹介】スーパーファミコン ポピュラス - YouTube: コメント欄の主人の言葉がすべて。
  • #714 ニュートピア Ⅰ Neutopia Ⅰ BGM ギターメドレー - YouTube
  • Export and Import
    • export は変数や関数の定義と同時に書いてもいいし、それらと個別に書いてもいい。
    • import は必要な要素だけそうするのが色々と有利だ。
    • export default 構文というのがある。中括弧なして import させる。 その場合には export される要素に名前がないことがあってもよい。 個別に export { XXX as default} のような指定をする。
      • default 要素を import する側で好きな名前を付けてもよい。
  • Dynamic imports
    • import を非同期関数呼び出しのように使うと動的インポート。
    • この方法はモジュールではないスクリプトに対しても適用できる。
  • Proxy and Reflect
    • Proxy というクラスが標準にある。それでオブジェクトをラップすることができる。
    • 未翻訳辞書の例は自然。
    • set() を操作するときには true/false を返すことを忘れない。
    • Proxy は関数にも適用できる。apply() を実装することになる。
    • Reflect という Proxy の単純版がある。両者を同時に使うこともある。
    • Proxy は組み込み型の内部情報と private メンバーにまでは手が届かない。
    • Proxy.revocable() は proxy とオリジナルオブジェクトとの結びつきをキャンセルすることを可能にする。 それには、後で戻り値の revoke() を呼び出す。