JavaScriptのAbortがやっと分かった
オチらしいオチはないです。
いろいろあって JavaScript のエラーを捕捉できるようにした。その結果、これまで捕捉できていなかった AbortError が捕捉された。はて、Abort なんて処理を作り込んだ覚えはないが?と思ったところから話ははじまる。
TurboのAbortError
調べていくと Turbo で Document を Fetch しているところで AbortError が起きていることが分かった。えー?と思って読んでみると、
- すでに current の fetch があったらそれを cancel
- fetch 開始時に current として保存
という流れになっていて、たまたま二重で fetch するような挙動になった場合に AbortError が上がるようになっていた。なるほどなぁ。
AbortControllerがよく分かっていなかった
このコードを読んでいて気付いたんだけど、実は自分は真面目に Abort を作り込んだことがなかったので、Abort についてちゃんと理解していなかった。なんとなーく AbortController で処理するんだろうと思っていたんだけど、あれ実際には AbortSignal の方が仕事していたんだということが分かった。
例えば Fetch だと Fetch の option が signal を受け付けてくれて、自動で Abort を処理してくれる。
大事なのは結局Eventの処理
Fetch のように自動でない場合の例は
にあって、
- signal を受け取る
- signal の abort event を listen する
- event の handler で処理を作り込む
が必要ということになる。んーつまり
EventBus最強
ということなのでは。標準で対応している API は AbortController が隠蔽してくれて abort を実現してくれる格好にはなっているけど、大事なのは Event だよね。
まぁそれなら逆に一貫していて分かりやすい。なんだ、そういうことか。