opensocial-jquery.jsとjsdeferred.jsを一緒に使ってみる
APIからJSON配列を取得して要素を展開する処理は、opensocial-jquery.jsでは下記のように記述できます。
$(document).ready(function(){ $.getJSON("/boke/randomArray?size=5") .next(function(data) { var bokes = data.randomArray; alert(bokes.length); $.each(bokes, function(i, boke) { alert(boke.bokeValue); }); }) .error(function() { alert("error"); }); });
待機を伴う配列の展開処理
上記の配列展開について「1つの要素を表示したら、3秒待って次の要素を表示する」というような待機処理を追加することを考えます。
opensocial-jquery.jsでは、待機処理のために$.wait()という関数が定義されています。
これを利用することにより、javascript標準のsetTimeout()を使わずにシーケンシャルな待機処理の記述が可能になります。
しかし、$.each()はDeferredオブジェクトに触らないので、each()のコールバック関数にreturn $.wait(3);としても、待機処理は有効になりません。
$.each(bokes, function(i, boke) { alert(boke.bokeValue); // 3秒待たずに次の要素へ return $.wait(3); });
jsdeferred.jsのloop()で配列を展開する
returnされたDeferredを処理してもらうには、loop()で配列を展開する必要がありますが、loop()は残念ながらopensocial-jquery.jsでは非対応です。
なので、opensocial-jquery.jsとjsdeferred.jsを共用することにしてみます。
$(document).ready(function(){ $.getJSON("/boke/randomArray?size=5") .next(function(data) { var bokes = data.randomArray; alert(bokes.length); Deferred.loop(bokes.length, function(i) { alert(bokes[i].bokeValue); return Deferred.wait(3); }); }) .error(function() { alert("error"); }); });
$.each()をDeferred.loop()で置き換えました。これでopensocial-jquery.jsから受け取った配列の展開を、待機処理を含めてシーケンシャルに記述することができるようになりました。