Effectuer un nouvel appel asynchrone dans une fonction de rappel
-
05-07-2019 - |
Question
Je souhaite utiliser le flux Google AJAX. API permettant d'extraire des flux d'actualités multiples et de les afficher sur une page Web.
Je ne peux pas utiliser la classe FeedControl de Google, car je souhaite contrôler le mode d'affichage des éléments du flux. Cela me laisse avec la classe Feed de Google comme seule option.
Je l'ai avec un seul flux: fournit une URL et une fonction de rappel; traiter les résultats du flux dans la fonction de rappel.
Ma question: comment puis-je récupérer plusieurs flux? Il me faudrait en quelque sorte créer un nouvel objet google.feeds.feed dans la fonction de rappel et lui fournir une nouvelle URL et ... la même fonction de rappel (?)
Je n’ai jamais étudié les sciences informatiques, alors ce genre de récursion me fait tourner la tête. Tout le monde peut expliquer ce que je dois faire?
La solution
Bien sûr, vous pouvez le faire de cette façon, voici un pseudocode:
// '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();
}
}
Je ne connais pas l'API Google Feed, d'où la fonction d'espace réservé start_feed_download
.
Cela a pour effet de démarrer le processus de récupération des flux via la fonction grabFeeds
, qui accepte un tableau de flux. grabFeeds
lance feedWorker
, qui initialise la première demande de flux, puis renvoie immédiatement (presque certainement avant l'extraction du premier flux). callback
traite le résultat, puis demande à feedWorker
de lancer la demande de flux suivante (le cas échéant).
La "magie" voici que feedWorker
et callback
sont tous deux fermetures . Ainsi, même si grabFeeds
a déjà été renvoyé, les variables index
et feeds
sont conservées. (dans un objet appelé "contexte d'exécution") tant que rien ne fait référence aux éléments du contexte d'exécution - dans notre cas, jusqu'à ce que callback
et feedWorker
ne soient plus référencé plus longtemps par les données de Google.
Autres conseils
Oui, vous pouvez le faire sans problème. Assurez-vous toutefois que chaque fois que vous effectuez une récursivité, vous avez deux cas (a) le cas de base et (b) le cas récursif.
La fonction ne s’appelle elle-même que dans le second cas. Assurez-vous de ne pas le faire dans le cas de base, sinon vous obtiendrez une récursion infinie. Par exemple, dans cette fonction factorielle, 0 est le cas de base, tout le reste est le cas récursif
function fact(n) {
if (n==0) { return 1; }
else { return n * factorial(n-1) }
}
Vous pouvez également les exécuter un par un, c.-à-d. démarrez le premier, puis le second, au lieu d'attendre le chargement complet de l'un avant que le second ne commence à se charger.