Des Appels asynchrones et la Récursivité avec Node.js

Je suis à la recherche d'exécuter un rappel lors de l'achèvement complet d'une fonction récursive qui peut aller pour une période indéterminée. Je suis aux prises avec async questions et en espérant obtenir de l'aide. Le code, à l'aide de la request module, est comme suit:

var start = function(callback) {
  request.get({
    url: 'aaa.com'
  }, function (error, response, body) {
    var startingPlace = JSON.parse(body).id;
    recurse(startingPlace, callback);
  });
};

var recurse = function(startingPlace, callback) {
    request.get({
        url: 'bbb'
    }, function(error, response, body) {
        //store body somewhere outside these funtions
        //make second request
        request.get({
            url: 'ccc'
        }, function(error, response, body) {
            var anArray = JSON.parse(body).stuff;
            if (anArray) {
                anArray.forEach(function(thing) {
                    request.get({
                        url: 'ddd'
                    }, function(error, response, body) {
                        var nextPlace = JSON.parse(body).place;
                        recurse(nextPlace);
                    });
                })
            }
        });
    });
    callback();
};

start(function() {
    //calls final function to print out results from storage that gets updated each     recursive call
    finalFunction();
});

Il semble qu'une fois mon code va passé le for boucle dans le imbriqués les demandes, il continue de la demande et la fin de la fonction initiale appel alors que les appels récursifs sont toujours en cours. Je le veux de ne pas finir le plus haut niveau de l'itération jusqu'à ce que tous les imbriquée appels récursifs ont terminé (que je n'ai aucun moyen de savoir combien il y en a).

Toute aide est GRANDEMENT appréciée!

vous devez donner aux choses des noms, et vous aurez besoin d'un emballage extérieur de la fonction autour de l'parties représentées wo que vous pouvez recueillir les résultats/le suivi des progrès.
Vous avez besoin de réparer beaucoup de choses. (1) le Changement recurse(nextPlace); à recurse(nextPlace, callback); (2) Si elle n'est pas un tableau dans votre test, la récursivité s'arrête, donc, juste après la if(anArray) {....} écrire callback(); (3) Supprimer entièrement le callback(); que vous avez tout en bas (4) Dans les commentaires de la partie si vous laissez quelque chose asynchrone arriver ou si l'exécution s'arrête, vous devriez passer de façon appropriée ou appelez le (à l'aide de return callback(); cette fois), la fonction de rappel respectivement. Vous êtes ensemble. En tout cas, ne (1) - (3) et vous permettra de savoir ce qui se passe.
J'ai seulement besoin de la dernière fonction qui doit être appelée une fois TOUS les récursivité boucles sont complètes. Cela permettra de l'appeler après chaque boucle a été achevé. Ma deuxième préoccupation, et la plus grande préoccupation est de savoir comment faire des requêtes HTTP de blocage - maintenant, une fois qu'ils sont appelés, la boucle continue et de ne pas attendre pour eux de complet. C'est vraiment ce qui fait de cette problématique.
Vous avez raison et j'avais tort ci-dessus. Vous devez alors utiliser asynchrone, par exemple, async.parallel, quand vous allez sur le tableau. Pour un exemple, voir ici: stackoverflow.com/q/26431257/1355058 où je voulais aussi passer les différents paramètres à tous les appels qui arrivent en parallèle. Maintenant, vous êtes fixé. 🙂
Je vais vérifier la async module dans un peu plus en détail. Est-il une fonction particulière qui fonctionne bien avec la récursivité? Je vais avoir besoin le plus haut niveau for boucle pour terminer la dernière, donc, quand je lance le rappel (je peux passer la condition pour tester si elle est égale à startingPlace), je suis dans le bon endroit?

OriginalL'auteur AvocadoRivalry | 2014-10-22