スライダーを動かしても、画面が変わらなかった

消費税を20%にした。ラベルは20.0に変わった。
グラフの数字が、1つも動かなかった。

日本経済シミュレーターをつくる第6回 / 全9回目次

計算が固まってきたので、ブラウザで実際に触って確かめる作業に入った。

消費税のスライダーを掴んで、10%から20%へ動かす。
スライダーの横のラベルは20.0になった。
変更したレバーに付く色も変わった。

右のダッシュボードだけが、まったく動かない。
名目GDPも、物価も、債務比率も、さっきと同じ数字のままだった。

エラーは出ていなかった

コンソールを見た。何も出ていない。
イベントは届いている。ラベルが更新されているのだから、そこは通っている。

実装はこうなっていた。

let queued = false;
function scheduleRecompute() {
if (queued) return;
queued = true;
requestAnimationFrame(() => { queued = false; recompute(); });
}

スライダーを掴んでいるあいだ、入力イベントは1秒に何十回も飛んでくる。
そのたびに25年ぶんを計算してグラフを描き直すのはもったいないので、1フレームに1回にまとめていた。
よくある書き方だと思う。

裏に回ったタブでは、rAFが止まる

requestAnimationFrame は「次に画面を描くとき」に呼んでくれる仕組みだ。
そのタブが表示されていなければ、画面は描かれない。
だからコールバックも呼ばれない。

私が使っていた検証用のブラウザは、裏に回っていた。
イベントは届く。ラベルも更新される。でも計算だけが永久に待たされる。

タイマーに変えた。

let queued = null;
function scheduleRecompute() {
if (queued !== null) return;
queued = window.setTimeout(() => { queued = null; recompute(); }, 16);
}

16ミリ秒でまとめるのは同じ。
タブが裏でも動く。

直したあと、消費税を20%にすると2050年の借金が253%から140%に落ちて、実質の手取りが491万円から459万円に減った。
見たかったのはこれだ。

人が触っている限り、絶対に出ない不具合

この不具合には、少し考えさせられた。

誰かがこのページを開いて、目で見ながらスライダーを動かしている限り、タブは必ず表示されている。
だからこの不具合は起きない。
手で確かめているうちは、一生見つからなかったはずだ。

見つかったのは、自動で触ろうとしたからだった。
スクリプトからスライダーに値を入れて、結果を読み取ろうとして、読み取れなかった。

自動で確かめる仕組みは、手で確かめる作業を速くするものだと思っていた。
実際には、手では絶対に踏まない道を踏んでくれる。
そちらのほうが値打ちがあるのかもしれない。

スタンプラリーに挑戦する 行った場所・気になる場所は、現地チェックインでスタンプに残せます。 みんなのコースを見てみる 会員が作ったスポット巡りのコースを都道府県から探せます。自分だけのコースも作れます。 運営者の個人noteも書いています AI活用やサイト運営で気づいたことを、もう少し個人の視点で掘り下げています。

※運営者が個人で書いているnoteです。

技術ブログ一覧へ戻る