fix: レンダリング中かどうかのチェックが正しく行われていないのを修正 #2713
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
内容
songTrackRenderer
のrequestRenderingInterruption
メソッドはレンダリング中でないときに呼び出すとエラーをthrowしますが、今のmainブランチでは、レンダリング中かどうかのチェックをsongTrackRenderer.isRendering
ではなくstate.nowRendering
で行っています。(本来はsongTrackRenderer.isRendering
をチェックすべき)また、
state.nowRendering
がtrueでsongTrackRenderer.isRendering
がfalseになるタイミングがあり、このタイミングでrequestRenderingInterruption
メソッドが呼ばれるとエラーが発生します。現在のバージョン(0.24.1)ではエラーが発生することはなさそうで、もし発生したとしても致命的な状況にはならなそうですが、意図した挙動ではないので修正します。
エラーが発生するタイミング
songTrackRenderer
のrender
メソッドの終了直前にisRendering
がfalseになり、再レンダリング要求がある場合は再度render
メソッドが実行されてisRendering
がtrueになりますが、render
メソッドはawait
しているので、await
以降の処理は別の(新たな)マイクロタスクとして実行されます。今のmainブランチのコードは、この
render
メソッドの終了と再実行の間に他の処理が挟まらない(nowRendering
がtrueであればisRendering
もtrue)のを前提として実装されていますが、前述のとおりrender
メソッドの再実行は別のマイクロタスクとして実行されるので、この前に他のマイクロタスクが実行されると、そのタスクでは、nowRendering
がtrueでisRendering
がfalseになります。そのタスク内でRENDER
アクションが呼び出されてというコードが実行されると、
isRendering
はfalseなのでrequestRenderingInterruption
メソッド内でエラーが発生します。バージョン0.24.1での影響
RENDER
アクションをawait
しているところは無いので、RENDER
内のrequestRenderingInterruption
メソッドを呼び出すところでエラーが発生しても、以降の処理が止まるなどの不具合が起こることはなさそうです。STOP_RENDERING
アクションも、STOP_RENDERING
の前後でRENDER
を呼んでいるところはなさそう(同じマクロタスクにはならなそう)だったので、こちらも不具合が起こることはなさそうです。関連 Issue
その他
グローバルな状態を非同期で複数回変更する処理(
RENDER
アクションのような処理)は、間にマイクロタスクが挟まって意図しないタイミングで状態が読み書きされるということが起こってしまう危険があるので、そういう処理は最初からマクロタスクとして開始(debounceするなど)するようにしたほうが良いのかもしれません。