Конечно, вы можете сделать это таким образом, вот какой-то псевдокод:
// '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.