簡體   English   中英

在回調函數中進行新的異步調用

[英]Make a new asynchronous call inside a callback function

我想使用Google AJAX Feed API來獲取多個新聞提要並將它們顯示在網頁上。

我無法使用Google的FeedControl類,因為我想控制供稿項的顯示方式。 剩下的唯一選擇就是Google的Feed類。

我已經將其與單個供稿一起使用:提供url和回調函數; 在回調函數中處理提要的結果。

我的問題:如何獲取多個提要? 我將不得不以某種方式在回調函數中創建一個新的google.feeds.feed對象,並為其提供新的url和...相同的回調函數(?)

我從未學習過計算機科學,因此這種遞歸使我無法自拔。 任何人都可以解釋我該怎么做?

當然,您可以這樣做,這是一些偽代碼:

// '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變量也feeds繼續存在(在稱為“執行上下文”的對象中),只要任何引用它內部的東西。執行上下文-在我們的例子中,直到Google的內容不再引用callbackfeedWorker為止。

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

僅在第二種情況下,函數才調用自身,請確保您不在基本情況下,否則最終將導致無限遞歸。 例如,在此階乘函數中,0是基本情況,其他都是遞歸情況

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

或者,您可以一次執行一次,即。 啟動第一個,然后啟動第二個,而不必等到第二個開始加載之前完全加載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM