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 のように自動でない場合の例は

AbortSignal - Web API | MDN

にあって、

  • signal を受け取る
  • signal の abort event を listen する
  • event の handler で処理を作り込む

が必要ということになる。んーつまり

EventBus最強

ということなのでは。標準で対応している API は AbortController が隠蔽してくれて abort を実現してくれる格好にはなっているけど、大事なのは Event だよね。

まぁそれなら逆に一貫していて分かりやすい。なんだ、そういうことか。

More