Hacer una nueva llamada asíncrona dentro de una función de devolución de llamada
-
05-07-2019 - |
Pregunta
Me gustaría usar el Feed de AJAX de Google API para obtener múltiples fuentes de noticias y mostrarlas en una página web.
No puedo usar la clase FeedControl de Google porque quiero controlar la forma en que se muestran los elementos de la fuente. Eso me deja con la clase Feed de Google como la única opción.
Lo tengo para trabajar con una sola fuente: proporcionar una URL y una función de devolución de llamada; procesar los resultados de la alimentación dentro de la función de devolución de llamada.
Mi pregunta: ¿Cómo obtengo varias fuentes? De alguna manera tendría que crear un nuevo objeto google.feeds.feed dentro de la función de devolución de llamada y proporcionarle una nueva URL y ... la misma función de devolución de llamada (?)
Nunca estudié ciencias de la computación, así que este tipo de recursión me da vueltas. ¿Alguien puede explicar lo que tengo que hacer?
Solución
Claro, puedes hacerlo de esta manera, aquí hay un 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();
}
}
No conozco la API de Google Feed, por lo tanto, la función start_feed_download
.
Lo que hace es iniciar el proceso de capturar las fuentes a través de la función grabFeeds
, que acepta una serie de fuentes. grabFeeds
inicia feedWorker
, que inicia la primera solicitud de feed, y luego devuelve inmediatamente (casi con seguridad antes de que se recupere el primer feed). callback
procesa el resultado y luego solicita a feedWorker
que inicie la próxima solicitud de feed (si la hay).
La " magia " aquí es que feedWorker
y callback
son cierres , por lo que aunque ya ha regresado grabFeeds
, las variables index
y feeds
siguen activas (en un objeto llamado " contexto de ejecución ") siempre que algo haga referencia a las cosas dentro del contexto de ejecución, en nuestro caso, hasta que callback
y feedWorker
no estén ya hace referencia a las cosas de Google.
Otros consejos
Sí, puede hacerlo bien, solo asegúrese de que cada vez que realice una recursión tenga dos casos (a) el caso base y (b) el caso recursivo.
Solo en el segundo caso la función se llama a sí misma, asegúrese de no hacerlo en el caso base o de lo contrario terminará con una recursión infinita. Por ejemplo, en esta función factorial 0 es el caso base, todo lo demás es el caso recursivo
function fact(n) {
if (n==0) { return 1; }
else { return n * factorial(n-1) }
}
Alternativamente, puedes hacerlas una a la vez, es decir. inicie el primero, luego inicie el segundo, en lugar de tener que esperar a que uno se cargue por completo antes de que el segundo comience a cargarse.