2009-10-21 139 views
1

我想用Google AJAX Feed API獲取多個新聞推送並將它們顯示在網頁上。在回調函數中創建一個新的異步調用

我無法使用Google的FeedControl類,因爲我想控制顯示Feed的項目的方式。這讓我把Google的Feed類作爲唯一的選擇。

我已經得到它與單一飼料的工作:提供一個url和回調函數;在回調函數內處理Feed的結果。

我的問題:我如何獲取多個Feed?我會不知何故必須在回調函數內創建一個新的google.feeds.feed對象,並提供一個新的url和...相同的回調函數(?)

我從未學過計算機科學,所以這種類型遞歸使我頭暈目眩。 任何人都可以解釋我必須做什麼?

回答

3

當然,你可以這樣做的,這裏的一些僞代碼:

// 'feeds' is an array of the feed URLs 
function grabFeeds(feeds) { 
    var index; 

    // We start with the first feed 
    index = 0; 

    // Kick off the process 
    feedWorker(); 

    // Our "go get the next feed" function 
    function feedWorker() { 
     var feed; 

     // Do we have any more? 
     if (index < feeds.length) { 
      // Yes, request it and bump our index 
      // (You could combine these lines, but it's 
      // clearer to keep them separate) 
      feed = feeds[index]; 
      ++index; 
      start_feed_download(feed, callback); 
     } 
    } 

    // Our callback function 
    function callback() { 
     // ...do something with the result... 

     // Kick of the next feed (feedWorker is defensive, 
     // so we don't have to check index here) 
     feedWorker(); 
    } 
} 

我不知道谷歌訂閱API,因此佔位符start_feed_download功能。

做什麼是開始通過grabFeeds函數抓取feed的過程,該函數接受一個feed數組。 grabFeeds啓動feedWorker,它啓動第一個提要請求,然後立即返回(幾乎可以肯定地在檢索到第一個提要之前)。 callback處理結果,然後要求feedWorker啓動下一個饋送請求(如果有)。

「魔術師」這裏是feedWorkercallback都是closures,所以儘管grabFeeds已經回來了,indexfeeds變量生活(在一個對象被稱爲「執行上下文」),只要任何引用執行上下文中的東西 - 在我們的例子中,直到callbackfeedWorker不再被Google的東西引用。

+0

謝謝,這沒有把戲。感謝關於閉包的更多解釋。現在閱讀它。 – Jan 2009-12-01 08:55:14

0

是的,你可以做到這一點,只要確保每次遞歸時都有兩種情況(a)基本情況和(b)遞歸情況。

只有在第二種情況下,函數纔會調用它自己,請確保您沒有在基本情況下,否則您將以無限遞歸結束。例如,在這個階乘函數0是基本情況,其他的一切都是遞歸情況下

function fact(n) { 
    if (n==0) { return 1; } 
    else { return n * factorial(n-1) } 
} 

或者,你可以做一個他們在同一時間,即。開始第一個,然後開始第二個,而不是在第二個開始加載之前等待一個完全加載。

+2

對不起,我只需要指出factorial函數中的經典錯誤。基本情況下,n == 0應該返回1,而不是零。 – 2009-10-21 12:32:04

+0

感謝您指出這一點,我真的需要測試我的代碼之前,我發佈 – 2009-10-21 20:48:19