FireFox の SCRIPT の実行補足
私の環境では、IE = IE 6.0.2900.2180, FireFox = FireFox 1.5.0.7 です。
id:shinichitomita:20061013 より、
HTTPリクエストの発行自体は並行される、ということ。その意味ですべての処理が直列になるわけではなく、
そうです、はっきり書きませんでしたが、あくまで遅延されるのはスクリプトがスクリプトエンジンで評価されるタイミングであって、リクエストは即座に発行されて、通常の時間でレスポンスがかえっています。
その前に「読み込みは完了していない状態のSCRIPTタグ」を破棄したら、スクリプトエンジンの実行がキャンセルされるのかどうか調べないと。
キャンセルされます。これは IE も同じです。ということで id:ladybug:20060926#p2 の補足。
実際にテストしたのは、
alert(text);
というスクリプトで、意図的にレスポンスが20秒かかるように Sleep() を仕込んだものです。これを追加して、20秒以内に SCRIPT タグを取り除くと、そのスクリプトは実行されませんでした。
もうすこし補足すると、指定した時間 Sleep する GetAlertScript.ashx があるとして、
<SCRIPT ID="nowait" SRC="GetAlertScript.ashx?sleep=0&text=nowait" /> <SCRIPT ID="quick" SRC="GetAlertScript.ashx?sleep=1&text=quick" /> <SCRIPT ID="slow" SRC="GetAlertScript.ashx?sleep=10&text=slow" />
というかんじの SCRIPT タグを埋め込むとして、ローカルホストぐらいに十分に高速な環境で、
var nowait, quick, slow; var headTag = ... headTag.appendChild(nowait); alert("append");
とすると、IE, FireFox ともに nowait → append と表示されます。quick だと append → quick になります。
ここまではおそらく予想がつくこととして、
headTag.appendChild(quick); headTag.appendChild(slow); alert("append");
だと、append → quick → 10秒後に slow
headTag.appendChild(slow); headTag.appendChild(quick); alert("append");
だと、append → 10秒後に quick, slow となります。何が並列化されていて、何が直列化されているかわかりますね?(当然、webserver へのリクエストは slow, quick ともに並列に実行されています。)
最後に、出力側を
alert(text);alert(text);
とし、1つめの ; の位置でバッファをフラッシュしてから指定時間待機するように変更し、これを呼び出す SCRIPT タグを remove してみましたが、1回目の alert() だけが実行される・・・ということは IE, FireFox ともに発生しませんでしたので、スクリプト実行エンジンには何も渡っていないのではないかと考えられます。
それが Lingr でどう困ったか
目指していたのは、hatena の日記編集画面や、FreeTextBox - ASP.NET Rich HTML editor のようなボタンだったので、即時応答してほしかったというのが1つなのですが、致命的な問題はサイコロのシステムの都合で、「JSON/JSONP のリクエストが発生してから何秒経過したか?」が非常に重要であったことです。
現在は、15秒以内に URL を他者へ向けて提示できることが前提*1になっているので、「いつ JSON/JSONP で取得したデータであるか」が重要で、リクエスト/レスポンスだけがさっさと完結してスクリプトの実行だけが遅延されるのは、致命的な問題になってしまいました。
*1:といっても変更したのは今日のお昼で、それまでは30秒でした