人気記事プラグインを作っていて、分からないことがあったので教えてください。
livedoor ProfileのJSONPを使ってブログの人気記事プラグインを作っていたら分からないことがありました。↓のようにJSONPのscriptタグをcreateElementで追加して、JSONのデータからリストを挿入するスクリプトをちょっと作ってみたのですが
<div id="poplist"></div>
<script type="text/javascript"><!--
// オブジェクト
function LDPJson(cat) {
this.category = cat;
}
// JSONPコールバック関数のインクルードメソッド
LDPJson.prototype.callJsonp = function(par) {
// JSONPのURL作成,パラメータ追加
par.callback += '_' + this.category.match(/\w+/g).join('');
var url = 'http://portal.profile.livedoor.com/api/' + this.category + '?';
var u = [];
for (var i in par) u.push(i + '=' + par[i]);
url += u.join('&');
// JSONPをインクルード(コールバック関数の実行)
var elScript = document.createElement("script");
elScript.type = 'text/javascript';
elScript.src = url;
document.getElementsByTagName('head')[0].appendChild(elScript);
};
// 人気記事のコールバック関数(JSONP側で実行)
function callback_clappop(json) {
if (json.status == "success") { // JSONステータスチェック
var img = '<img src="http://portal.profile.livedoor.com/img/cmn/clapping.gif" />';
var t = '<ul class="poplist">';
var j = json.entries;
for (var i = 0; i < json.entries.length; i++) {
t += '<li><a href="' + j[i].link + '">' + j[i].title + '</a> ' + img + '×' + j[i].count + ' (' + j[i].date + ')</li>';
}
document.getElementById('poplist').innerHTML = t + '</ul>';
}
}
// オブジェクト作成
var LDBPopList = new LDPJson('clap/pop');
// JSONPを呼び出す
LDBPopList.callJsonp({ row:5, livedoor_id:'ユーザID', escape:1, callback:'callback' });
//--></script>
たまにJSONの項目にあるstatusが'wait'になってデータが取得できないことがあります。その場合もう一度データを取得したいのですが,何か良い方法がありましたら教えてください。
ヒントや雑感などでも結構です。
よろしくお願いいたします。
回答
コメント(5)
やっぱりもう一度リクエストを出すしかしょうがないんじゃない?
(キャッシュの問題もあるし面倒だね、っていうかできてから呼び出してくれよって感じ?)
はい。そうなのですが、再リクエストするにしても、
createElementを繰り返せばいいのかとか、繰り返した場合記述順と実際の実行順序はどうなるのかとか、際限なくcreateElementを繰り返すのも状況によってはブラクラになりそうなので、制限をかけようかと思いましたが、カウントをグローバルにするのも何なので、static変数みたいなのは無いのかなとか、色々細かいことを考えていたら考えがまとまらなくなってきたので、一般的にどういう手法があるのか知りたくなりました。
だた検索しても「エラー -> 再リクエスト」みたいな動作のサンプルは見つからないので、普通はエラーの確立は非常に低いものとしているようですね。
というか、作ったときはなぜかそこそこの確立だったのですが、今は9割9分くらいで正常なので、このままでもいいような気がしてきました。。
#1>記述順と実際の実行順序はどうなるのか
実行順は、書いた順ですけど、
同じ内容を書いた場合、後から書いた物で置き換えられてしまいますから、後のものがコールバックで呼び出される。
・と思います。
#1>static変数みたいなのは無いのかな
クロージャの中に押し込めると(C言語でいう関数内の)static 変数の様に使えます。
#1>一般的に
一般的には、コールバックしてくる側が準備ができてから呼び出し来るのが普通だと思います。(それほど経験値があるわけでもないけど)
そのために、普通再呼び出しするようなコードがないのだと思います。
#1>このままでもいいような気がしてきました
キャッシュの問題も面倒だし、そのままでいいんじゃないですかね。
#3>クロージャー
例:
function counter(){
var n = 0;
return function(){ return ++n; };
}
counter1 = counter();
alert(counter1());//1
alert(counter1());//2
counter2 = counter();
alert(counter2());//1 :counter1()とは別
alert(counter1());//3 :それぞれのn は、別
もちろん、クラス(オブジェクトのプロパティ)にしても同じようなことはできます。
色々ありがとうございます。
心のベストを差し上げたいです。
status=='wait'の時は、向うでキャッシュされることは無いみたいなので、
すぐに再読み込みしても大丈夫みたいです。


