Сделайте новый асинхронный вызов внутри функции обратного вызова - PullRequest
1 голос
/ 21 октября 2009

Я хотел бы использовать Google AJAX Feed API для получения нескольких новостных лент и отображения их на веб-странице.

Я не могу использовать класс FeedControl от Google, потому что я хочу контролировать способ отображения элементов канала. Это оставляет меня с классом Google Feed как единственным вариантом.

У меня есть для работы с одним фидом: предоставить URL и функцию обратного вызова; обработать результаты канала внутри функции обратного вызова.

Мой вопрос: как мне получить несколько каналов? Я бы как-то должен был создать новый объект google.feeds.feed внутри функции обратного вызова и предоставить ему новый URL-адрес и ... ту же функцию обратного вызова (?)

Я никогда не изучал компьютерные науки, поэтому такая рекурсия заставляет мою голову кружиться. Кто-нибудь может объяснить, что я должен делать?

Ответы [ 2 ]

3 голосов
/ 21 октября 2009

Конечно, вы можете сделать это таким образом, вот какой-то псевдокод:

// '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 запустить следующий запрос фида (если он есть).

"Волшебство" здесь заключается в том, что feedWorker и callback оба являются замыканиями , поэтому, даже если grabFeeds уже вернулось, переменные index и feeds живут (в объект, называемый «контекстом выполнения»), пока что-либо ссылается на вещи внутри контекста выполнения - в нашем случае, до тех пор, пока callback и feedWorker больше не будут ссылаться на вещи Google.

0 голосов
/ 21 октября 2009

Да, вы можете сделать это хорошо, просто убедитесь, что всякий раз, когда вы делаете рекурсию, у вас есть два случая (а) базовый случай и (б) рекурсивный случай.

Только во втором случае функция вызывает саму себя, убедитесь, что вы не в базовом случае, иначе вы получите бесконечную рекурсию. Например, в этой факториальной функции 0 - базовый случай, все остальное - рекурсивный случай

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

Кроме того, вы можете сделать их по одному, т.е. запустите первый, затем запустите второй, вместо того, чтобы ждать, пока он полностью загрузится, прежде чем начнется загрузка второго.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...