2009-10-21 95 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