2011-08-04 18 views
0

GoogleフィードAPIを使用してRssフィードURLを読み取り、タイトルを表示しました。私は関数を呼び出すときget_rss1_feedsそれは正常に動作します。しかし、setTimeoutまたはsetIntervalで呼び出すと、空白の画面しか表示されず、ページの読み込みが停止しません!!GoogleフィードAPIのsetTimeout問題

<script src="http://www.google.com/jsapi?key=AIzaSyA5m1Nc8ws2BbmPRwKu5gFradvD_hgq6G0" type="text/javascript"></script>  
<script type="text/javascript" src="jquery-1.5.2.min.js"></script> 
<script type="text/javascript" src="query.mobile-1.0a4.1.min.js"></script> 
<script type="text/javascript" src="jsRss.js"></script> 
<script type="text/javascript" src="notification.js"></script> 

マイnotification.js

/** global variable **/ 
var Rsstitle; 
/** end global variable **/ 

document.addEventListener("deviceready", onDeviceReady, false); 
// PhoneGap is ready 
// 
function onDeviceReady() { 
// Empty 
} 

function get_rss1_feeds() { 
    console.log('test');    // this is being outputted 
    var Rss1_title = getRss("http://yofreesamples.com/category/free-coupons/feed/?type=rss", function(entry_title) {  
     if(Rsstitle != entry_title) 
     Rsstitle = entry_title; 
     console.log('test1',Rsstitle); // not working 
    }); 
} 

//get_rss1_feeds() works fine 
setTimeout(get_rss1_feeds,5000); 

マイjsRss.jsあなたはgetRss()機能にブレークポイントを設定し、それがsetTimeout()から呼ばれていたときに何が起こっているのか確認する必要が

function getRss(url, callback){ 
    console.log('test2');   // this is being outputted 
    if(url == null) return false; 
    google.load("feeds", "1"); 
    // Our callback function, for when a feed is loaded. 
    function feedLoaded(result) { 
     if (!result.error) { 
      var entry = result.feed.entries[0]; 
      var entry_title = entry.title; // need to get this value 
      callback && callback(entry_title);   
     } 
    } 
    function Load() { 
     // Create a feed instance that will grab feed. 
     var feed = new google.feeds.Feed(url); 
     // Calling load sends the request off. It requires a callback function. 
     feed.load(feedLoaded);  
    }  
    google.setOnLoadCallback(Load);    
} 

答えて

1

ファイル。私の推測では、その関数内の何かにスコープの問題があり、setTimeoutが実行されているグローバルスコープからは利用できませんが、通常のスコープから試してみることができます。変数にすることもできますし、利用可能ではありません。

これは、関数が別の関数内で宣言されているため、実際にグローバルに使用できない場合に発生することがあります。

var Rsstitle = entry_title; 
+0

私はこれをgetRSS()関数内にconsole.log()は、それは思わなかった:

var Rsstitle; if(Rsstitle != entry_title) Rsstitle = entry_title; 

あなたはこれでそれを置き換えることができます。

FYI、このコードブロックは非常に奇妙ですその機能の中には入っていません。実際にコールバック関数から値を取得するという初期の問題がありました。 [私の前の質問へのリンク](http://stackoverflow.com/questions/6946711/how-to-get-the-value-from-a-callback-function)。これはほぼ続きです。 –

+0

5000ミリ秒ごとに値を取得すると、同じタイトルを何度も何度も表示しないようにしたいと思います。重複を避けるために! –

+0

'getRSS()'が呼び出されない場合は、 'get_rss1_feeds()'から呼び出す際にある種の範囲の問題がなければなりません。 console.logを 'get_rss1_feeds()'の最初の行に置き、それが呼び出されていることを確認してください。このタイトルを前のタイトルと比較したい場合は、この宣言「var Rsstitle;」をトップレベルのスコープに移動する必要があります。そのため、ある呼び出しから次の呼び出しまで続くグローバル変数にすることができます。今のように、 'get_rss1_feeds()'が終了するとすぐにリサイクルされるローカル変数ですので、何も達成できません。 – jfriend00