JavaScriptって、の続き
具体的には、ゲームなんかで
function playTutorial() { message('歩きます。'); // メッセージwindowが開き、クリックすると次に進む walk(); // プレイヤーが歩く。アニメーションが終わると次に進む message('歩きました。'); }
こう書きたい。function を chain させるのは記述が面倒で嫌。HTML5 でマルチスレッドが使えるという Web Workers も、yield とかできないのでこういう用途には使えないっぽい。JavaAppletを使ってJavaScriptをsleepさせる裏技があるようなのでそれを使って、とかWeb Workers でビジーウェイトさせて、とか考えたけど相当いまいち。そうなるとメタ言語みたいな方向ですかね、というわけですぐ使えそうなのが Concurrent.Thread である。
var message = Concurrent.Thread.compile(function(msg) { document.body.innerHTML = msg; var thread = Concurrent.Thread.self(); document.onclick = function() { document.onclick = null; thread.notify(); }; try { Concurrent.Thread.stop(); } catch(e) {} }); var walk = Concurrent.Thread.compile(function() { document.body.innerHTML = 'walking'; for (var i = 0; i < 5; i++) { Concurrent.Thread.sleep(1000); document.body.innerHTML += '.'; } }); Concurrent.Thread.create(playTutorial);
牧さんすごいねー。
重大な問題が
Concurrent.Thread は Array.prototype などを拡張しているので、多くのJavaScriptフレームワークと競合する。こまったねー。