Google API api поведения

Я экспериментирую с Google Feed API. По сути, я хочу получить список своих каналов вместе с некоторой информацией о записях каналов, чтобы обрабатывать исторические каналы, обычно недоступные в Google Reader. Я озадачен одним поведением API фида Google, которое я описываю как комментарий в коде ниже. Я уверен, что я ничего не понимаю, так как я новичок в JS.

Это код с моим вопросом в качестве комментариев:

<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 продолжает выполняться, и в результате вы всегда видите последний фид в массиве.

Я считаю, что закрытия должны помочь вам в этой ситуации.

Подумайте о размещении всего блока внутри внешнего цикла 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");
}​
Другие вопросы по тегам