728 日目(曇りのち雨)晩飯を買い求められない日が続く
とにかく自習で気を紛らす。
- 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 を開く。写真整理。 バブルシンフォニーの絵は殺伐としていなくていい。
- 【お皿月間】皿曲のスコアを伸ばしていきたい定期配信#159【音ゲー / beatmania IIDX / CastHour / DOLCE.】 - YouTube: 終盤だけ視聴。
- Async iteration and generators
Symbol.asyncIteratorを採用することで非同期的 iterable を定義する。 メソッドnext()をasyncとする。言い換えるとPromiseを返す。- ループでそのような iterable を反復するときは
for await文を用いる。 async function*構文で非同期 generator を定義する。
- Modules, introduction
file://プロトコルではimport/exportは機能しない。- モジュールは自動的に strict mode になるので、アレを明示的に書かなくて済む。
- モジュールは HTML ファイル内に定義することもできる。
- モジュールは自動的に
deferになる。
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()を呼び出す。