Faça uma nova chamada assíncrona dentro de uma função callback
-
05-07-2019 - |
Pergunta
Eu gostaria de usar o Google AJAX de alimentação API para buscar múltiplas newsfeeds e exibi-los em uma página web.
Eu não posso usar classe FeedControl do Google, porque eu quero controlar a forma como os itens da alimentação são exibidos. Isso deixa-me com classe Feed do Google como a única opção.
Eu tenho que trabalhar com um único feed: fornecer uma url e uma função de retorno; processar os resultados da alimentação no interior da função de retorno.
A minha pergunta: Como faço para buscar vários feeds? Eu de alguma forma tem que fazer um novo objeto google.feeds.feed dentro da função de retorno de chamada e fornecê-lo com um novo URL e ... o mesmo callback-função (?)
Eu nunca estudou ciências da computação, por isso este tipo de recursão faz minha cabeça girar. Alguém pode explicar o que eu tenho que fazer?
Solução
Claro, você pode fazê-lo dessa maneira, aqui está um pseudocódigo:
// '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();
}
}
Eu não sei a API do feed do Google, portanto, a função de espaço reservado start_feed_download
.
O que faz é start o processo de agarrar os feeds através da função grabFeeds
, que aceita uma matriz de feeds. grabFeeds
começa feedWorker
, que inicia a primeira solicitação de alimentação e retorna imediatamente (quase certamente antes da primeira alimentação são recuperados). callback
processa o resultado, em seguida, pede feedWorker
para lançar a próxima solicitação de alimentação (se houver).
A "mágica" aqui é que feedWorker
e callback
são ambos fechamentos , por isso mesmo que grabFeeds
já voltou, as variáveis ??index
e feeds
viver (em um objeto chamado um "contexto de execução"), enquanto referências qualquer coisa coisas dentro do contexto de execução - no nosso caso , até callback
e feedWorker
já não são referenciados por coisas do Google.
Outras dicas
Sim, você pode fazer isso tudo bem, apenas certifique-se que sempre que você fazer recursão você tem dois casos (a) O caso base e (b) No caso recursiva.
Apenas no segundo caso faz a própria chamada de função, certifique-se de não fazer no caso base, ou então você vai acabar com uma recursão infinita. Por exemplo, nesta função factorial 0 é o caso base, tudo o resto é o caso recursiva
function fact(n) {
if (n==0) { return 1; }
else { return n * factorial(n-1) }
}
Como alternativa, você poderia fazê-las uma de cada vez, ou seja. iniciar o primeiro, em seguida, iniciar o segundo, em vez de ter que esperar por um estar completamente carregada antes da segunda começa a carregar.