2012-11-18 145 views
1

我使用google feed api進行實驗。基本上,我需要一個我的提要列表以及提要條目的一些信息,以便處理通常在谷歌閱讀器上不可用的歷史提要。我對谷歌飼料API的一種行爲感到困惑,我在下面的代碼中將其記錄爲註釋。因爲我是js的新手,所以我確定我沒有得到任何東西。Google feed api behavior

這是我的問題的代碼註釋:

<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> 
    <script type="text/javascript" src="https://www.google.com/jsapi"></script> 
    <script type="text/javascript" charset="UTF-8" > 


    google.load("feeds", "1"); 

    /* Here I define the list of my feeds */ 

    var feeds=['MYFEED1', 'MYFEED2', 'AND SO ON']; 

    function initialize() { 
     for (var j=0;j<feeds.length;j++) { 
     var feed = new google.feeds.Feed(feeds[j]); 
     feed.includeHistoricalEntries(); 
     feed.setNumEntries(100); 

     feed.load(function(result) { 
      if (!result.error) { 
      var container = document.getElementById("out"); 
      var furl = result.feed.feedUrl; 
      var flink = result.feed.link; 
      for (var i = 0; i < result.feed.entries.length; i++) { 
       var entry = result.feed.entries[i]; 

       var div = document.createElement("div"); 

       /* HERE IS WHERE I DON'T GET IT. 
           feeds[j] always just shows the last feed in the array. 
           But furl always shows the correct feedUrl 
       Though if I uncomment alert("NEXT") few lines below 
           thus giving a short pause, feeds[j] correctly 
           shows the same url as feedUrl. Why? */ 
       div.appendChild(document.createTextNode(feeds[j]+" " 
          +furl+" "+flink+" "+ entry.link + " " + entry.title)); 
       container.appendChild(div); 
      } 
     } 
     }); 
    //alert("NEXT"); 
    } 
} 

    google.setOnLoadCallback(initialize); 

    </script> 
    </head> 
    <body><div id="out" ></div> 
    </body> 
</html> 

此外,我想知道是否有通過查詢mysql數據庫設置飼料數組的值的方式。

回答

1

在我看來,feed.load()是一個ajax調用,並且您正在傳遞一個回調函數以在從請求返回時執行。因爲ajax是異步的,所以外部的for循環繼續執行,結果你總是看到數組中的最後一個feed。

我認爲在這種情況下,封閉應該可以幫到你。

考慮將整個塊放在outer for循環中放在一個單獨的函數中並使用閉包。 事情是這樣的:

function initialize() { 
for (var j = 0; j < feeds.length; j++) { 
    (function(val) { //closure begin 
     var j = val; 
     var feed = new google.feeds.Feed(feeds[j]); 
     feed.includeHistoricalEntries(); 
     feed.setNumEntries(100); 

     feed.load(function(result) { 
      if (!result.error) { 
       var container = document.getElementById("out"); 
       var furl = result.feed.feedUrl; 
       var flink = result.feed.link; 
       for (var i = 0; i < result.feed.entries.length; i++) { 
        var entry = result.feed.entries[i]; 

        var div = document.createElement("div"); 

        /* HERE IS WHERE I DON'T GET IT. 
          feeds[j] always just shows the last feed in the array. 
          But furl always shows the correct feedUrl 
      Though if I uncomment alert("NEXT") few lines below 
          thus giving a short pause, feeds[j] correctly 
          shows the same url as feedUrl. Why? */ 
        div.appendChild(document.createTextNode(feeds[j] + " " + furl + " " + flink + " " + entry.link + " " + entry.title)); 
        container.appendChild(div); 
       } 
      } 
      } 
     })(j); //Closure end 
    }); 
    //alert("NEXT"); 
}​ 
+0

謝謝哈里什,我想你的建議,將開始​​和結束的結束,但我沒有得到在瀏覽器上任何東西。只是空白。 – Gius

+0

@Gius - 我不熟悉谷歌飼料api,但當我嘗試!result.error總是評估爲false,因此如果塊內部的代碼永遠不會執行,因此空白頁面。錯誤對象具有無效的url錯誤(代碼400)。 – Harish

+0

但沒有關閉,這個錯誤沒有發生,謝謝。不是什麼大不了的事情,我只是感到困惑,但我認爲我理解你說的理由是異步 – Gius