【问题标题】:Make a new asynchronous call inside a callback function在回调函数中进行新的异步调用
【发布时间】:2010-12-08 16:38:15
【问题描述】:

我想使用Google AJAX Feed API 获取多个 新闻源并将它们显示在网页上。

我无法使用 Google 的 FeedControl 类,因为我想控制 Feed 项目的显示方式。这让我只能选择 Google 的 Feed 类。

我已经让它与单个提要一起工作:提供一个 url 和一个回调函数;在回调函数中处理提要的结果。

我的问题:如何获取多个提要?我将不得不在回调函数中创建一个新的 google.feeds.feed 对象,并为其提供一个新的 url 和......相同的回调函数(?)

我从来没有学过计算机科学,所以这种递归让我头晕目眩。 任何人都可以解释我必须做什么?

【问题讨论】:

    标签: javascript function asynchronous callback


    【解决方案1】:

    是的,您可以这样做,只要确保在进行递归时有两种情况 (a) 基本情况和 (b) 递归情况。

    只有在第二种情况下,函数才会调用自身,请确保您不在基本情况下,否则您将得到无限递归。例如,在这个阶乘函数中,0 是基本情况,其他都是递归情况

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

    或者,你可以一次做一个,即。启动第一个,然后启动第二个,而不必等待一个完全加载,然后第二个开始加载。

    【讨论】:

    • 抱歉,我只需要指出您的阶乘函数中的经典错误。基本情况,n==0 应该返回 1,而不是零。
    • 感谢您指出这一点,我确实需要在发布之前测试我的代码
    【解决方案2】:

    当然,你可以这样做,这里有一些伪代码:

    // '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();
        }
    }
    

    我不知道 Google Feed API,因此我不知道占位符 start_feed_download 函数。

    这样做是开始通过grabFeeds 函数获取提要的过程,该函数接受一个提要数组。 grabFeeds 启动feedWorker,它启动第一个提要请求,然后立即返回(几乎可以肯定在第一个提要被检索之前)。 callback 处理结果,然后要求 feedWorker 启动下一个提要请求(如果有的话)。

    这里的“魔力”是feedWorkercallback 都是closures,所以即使grabFeeds 已经返回,indexfeeds 变量仍然存在(在一个名为“执行上下文”),只要任何东西都引用了执行上下文中的东西——在我们的例子中,直到 callbackfeedWorker 不再被 Google 的东西引用。

    【讨论】:

    • 谢谢,成功了。感谢您对闭包的补充说明。现在阅读它。
    猜你喜欢
    • 2015-01-22
    • 1970-01-01
    • 2017-11-18
    • 2012-08-12
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多