仕事での話ですが、なにやらあるページを抜ける際に必ず不可思議なポップアップウィンドウが表示されて自動的に消える、という実装がありました。
気にはなってはいたのですが、あまり興味もなかったので放置していました。

ところがそれのせいで納品先にはブラウザのポップアップを許可するように設定してください、と言ってまわっているとのこと。

先日、たまたまその部分の実装を目にする機会があったので、というか暇だったのでソースを眺めていたら見つけてしまったのですが、別にフツーにXmlHttpRequestで投げればいいじゃん、という内容のものでした。

やりたいこととしては、そのページを抜ける際にサーバーにとある処理をさせたい、というだけのもので、window.beforeunloadイベントをフックして、その中でwindow.openでURLにサーバー側にさせたい処理のアクションを指定して実行していました。

なぜPrototypeが標準で使える環境でそんなことをしているのかと不思議になってしまい、「ウィンドウ出さないようにしましょうか?」と言ってみると「え、だってできないんじゃないですか?」との返答。

どうもソースを見てみると、Ajaxでやろうとした形跡がコメントアウトで残っていました。で、納得。非同期で実行してるからうまくいかずにわざわざ別ウィンドウ開いてたのか、、、。

PrototypeのAjaxオプションには、asynchronousというオプションがあり、これに false を指定すれば非非同期(ようは同期)で動くのでXmlHttpRequestの処理が終わるまで制御は戻らずに、ちゃんと処理が終わってからイベントを抜けるようにできます。
デフォルトはtrueで非同期なんですけど(Ajaxっていうくらいですから、、、)。
これを長いこと放っておいたのか、、、。

というわけで、以下のように書けば、同期で動いてくれます。

new Ajax.Request(
? "http://リクエスト先URL",
? {
??? asynchronous: false
? });
alert("ちゃんとリクエストが処理されてからこのメッセージが表示されます");

簡単な話です。
ちなみにjQueryなら、
$.ajax({
? async: false,
? url: "http://リクエスト先URL"
});

ドキュメントは見ればちゃんと書いてあることです。ちゃんと見るようにしましょう!
非同期処理は実は結構面倒な側面が多いので、特に理由がなければ非同期オプションはfalseにした方が何かと書きやすいのです。
マルチスレッドのプログラミングが結構面倒なように、、、。?
jQueryのAjaxオプションのドキュメント
PrototypeのAjaxオプションのドキュメント

明日携帯を買いに行ってきます。