人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

関数内の配列を関数外で使うにはどのような方法がありますか?
実際には、Google Feed Apiで取得したデータを日付でsortして最近更新のある5件を表示したいのです。つくってたら以下のようになり、当然出来なくて挫折。対処方法を初心者なので優しく教えてください。

<script>
google.load('feeds', '1');
function feeds_init(){
var rss=new Array('http://hatena.ne.jp/','http://hatena.ne.jp/');
var rssNum=rss.length+1;
var container=document.getElementById('feedControl');
var blogs=[];
for(var f=0; f < rssNum ; f++){
var feed=new google.feeds.Feed(rss[f]);
feed.setNumEntries(1);
feed.load(function(result) {
if (!result.error) {
var text='';
var entries='';
for (var i=0; i < result.feed.entries.length; i++) {
var entry=result.feed.entries[i];
text+=entry.title;
text+=entry.publishedDate;
text+=entry.contentSnippet;
entries+='<a href="'+entry.link+'">'+text+'</a>';
var entryTime=Date.parse(entry.publishedDate);
}
blogs.push(new entryData(entryTime, result.feed.title+entries));
}
});
}
blogs.sort(tmp);
for (var i=0; i < blogs.length; ++i) {
container.innerHTML+=blogs[i].data;
}
function entryData(date, data) {
this.date=date;
this.data=data;
}
function tmp(a, b){
return b[0] - a[0];
}
}
google.setOnLoadCallback(feeds_init);
</script>


●質問者: linyows
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:API Date. e+ Google PUSH
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● pahoo
●15ポイント

script language の指定がありませんが、JavaScript のご質問ですよね。

たとえば、ご質問のソースの中の配列変数 rss[] を関数 feeds_init の外で使いたいということであれば、グローバル変数にすればいいでしょう。

具体的には、

var rss=new Array('http://hatena.ne.jp/','http://hatena.ne.jp/');
function feeds_init(){
 var rssNum=rss.length+1;
 ?以下省略?

のように書きます。


参考サイト

◎質問者からの返答

失礼いたしました。JavaScriptです。

説明不足だったので補足いたします。

var blogs=[];

に関数内から、以下のようにアクセス(push)して

blogs.push(new entryData(entryTime, result.feed.title+entries));

最後に

blogs.sort(tmp);

でソートしたいのです。

できない気がするので、代替方法ってありませんか?


2 ● pahoo
●15ポイント

質問にあるスクリプトですと関数 entryData がどんな作用をするのか分からない(それによって関数 tmp の書き方が変わってくるはず)のですが、#1 で回答したように、配列 blogs をグローバル変数にすることで、関数 feeds_init の外部で参照・更新することはできます。


entryData の作用が分からないと書きましたが、もしかすると、blogs.push の書き方が間違っているのではないでしょうか?

blogs[i++] = new entryData(entryTime, result.feed.title+entries);

のような気もします(iの初期値はゼロ)。

◎質問者からの返答

何度もありがとうございます!

ん?なんだか分からなくなってきましたorz

つまり、FeedApiから取得した内容を一旦blogsにため込んで日付でソートしたものを表示させるつもりでスクリプトを書きました。

元は、http://code.google.com/intl/ja/apis/ajaxfeeds/documentation/hell...

を参考にしてます。

いろいろと、使い方を間違っていたらご免なさい。指摘をお願いします。

feed.load(function(result) {...}でのblogs.pushが外で有効にならないんですよね?

当たり前なのかもしれませんが。。。

よろしくお願いします。


3 ● ardarim
●100ポイント ベストアンサー

基本的に使い方は正しいと思いますし、関数内でblogs.push()したものも後でblogs.sort()したり、値を取り出したりできるはずです。


気をつけなくてはいけないのは、feed.load()は、同期実行されないということです。つまり、フィードの読み込みが終わってblogs.push()が実行される前に、for()を抜けてしまっているのです。まだblogs.push()が実行されていませんので、blogs.sort()やその後が実行されてもblogsの中身は空っぽのように見えます。

blogs.sort()などを実行した後、非同期でフィードの読み込みが終わってやっとblogs.push()が実行され、データが収まります。


こういう場合は、例えばフィードの読み込み中の数(非同期実行している数)を覚えておいて、フィードの読み込みが終わってblogs.push()するたびに -1 していく。フィードの読み込み中の数が 0 になったら(フィードを全部取得できたら)、blogs.sort()以降の処理を実行するようにするとかでいけるのではないでしょうか。

◎質問者からの返答

回答ありがとうございます。

なるほど!そういうことだったんですね。

非同期!orz

デバッグすると順番が逆になっていたので変だなと思っていたのに全く気づきませんでした。

アドバイスの通り、

読み込み数のカウントが0になり、関数にしたblogs.sort()を実行したらうまくいきました!

本当にありがとうございました!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ