Сделайте новый асинхронный вызов внутри функции обратного вызова

StackOverflow https://stackoverflow.com/questions/1600370

Вопрос

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

Я не могу использовать класс FeedControl от Google, потому что я хочу контролировать способ отображения элементов канала. Это оставляет меня с классом 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();
    }
}

Я не знаю API фидов Google, поэтому функция заполнителя start_feed_download .

Это запуск процесса захвата каналов с помощью функции grabFeeds , которая принимает массив каналов. grabFeeds запускает feedWorker , который инициирует первый запрос фида, а затем сразу же возвращает (почти наверняка до того, как будет получен первый фид). callback обрабатывает результат, затем просит feedWorker запустить следующий запрос фида (если он есть).

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top