Sjaxを使ってみた。
実は、会社を辞めてからの方が忙しい。。。会社にいたときは、「会社での仕事をする」という正統な理由があったため、ずっと後回しにしていたTODOが溜っていたのだ。で、最近は、ずっと家にいるので、溜ったTODOをこなすのに、ヒーヒー言っている。
最近は、ほとんどJavaScriptしか書いていない。もしかしたらPHPよりも得意な言語かもしれないので、まぁ、いいのだが、結構いっぱいいっぱい。
で、最近、Ajaxで受け取った結果を非同期ではなく、同期で次の処理に使いたいときがあった。つまり、Asynchronousではなくて、Synchronousなので、Sjaxか。って、ちゃんとそういう言葉があるんだね。
私の理解が正しければ、単純に、Ajax.Request(すでにprototype.js前提)のoptionsにasynchronous: falseって書くだけだけどね。
Ajaxの場合は、onLoadingとかonCompleteのイベントにゴニョゴニョ書いて返ってきたデータをよろしく加工しちゃったりするわけだが、まぁ、普通にこんな感じ。
new Ajax.Request(
url,
{
method: 'get',
parameters: $H({'par1': "parameter1desu", 'par2': "parameter2desu"}).toQueryString(),
onComplete: function(request) {
// request.responseTextをゴニョゴニョしちゃうの。
alert(request.responseText);
}
}
);
Sjaxの場合は、Ajax.Requestオブジェクトのtransport.responseTextで受け取ったものをゴニョゴニョするって感じ。
var ajax = new Ajax.Request(
url,
{
asynchronous: false, // デフォルトはtrueなので、指定しないとAjaxとなる。
method: 'get',
parameters: $H({'par1': "parameter1desu", 'par2': "parameter2desu"}).toQueryString()
}
);
// ajax.transport.responseTextをゴニョゴニョしちゃうの。
alert(ajax.transport.responseText);
つーか、onCompleteとかonLoadingとかって書いてみたけど、何もしてくれないのね。まぁ、synchronousだから当然だけども。
確かに「Sjaxとは」にも書いてあるように、メリットは、結果をそのまま次の処理で使えちゃうことかな。まぁ、その間、同期なので、止まるけど。でも、ある関数内で、Ajax.Requestなどの結果を修正して返したいときなんかは便利だよね。イベントにそのまま渡して、非同期に処理を実行して終了するものだったらいいけど、それから先にまだまだそのデータを使いたいときとかにね。
私は、どうしても同期をとりたいときがあるんだけど、どうしたらいいのかなー、なんて考えて、フラグを立ててそれを見張るか?とか考えたんだけど、Sjaxでいいのね。
Shin Ohno 2003-2012