JavaScriptでゲーム作ってたときに同じ状況で悩んだなぁ
スレッドないし、おれ頭悪いので
「処理終わらせる関数」として書くからそうなるのだと考えて
「処理を進める関数/終わった時に呼ばれる関数」に分離したらなんとかなった

Rubyならスレッドかなぁ
コルーチンってよく判らんけど言語機能で同じ事やってるだけなのかな