JavaScript : Appel De Fonctions Récursives Avec Des Promesses

Langage: JavaScript


La récursivité - Pas mon Sujet Préféré.

Promet - Ils peut-être embrouillé.

La récursivité + Promet - j'ai besoin de programme dans une chambre capitonnée.

J'ai réalisé ce petit JS Fiddle puzzle j'appelle Le RecursiveFunHouse comme comique façon de garder ma santé mentale en simplifiant le problème en quelque chose de stupide. Espérons que yall pouvez obtenir un rire hors de ma douleur 🙂

Le Problème:

Chaque appel récursif dépend du résultat de l'appel précédent, mais pour obtenir le résultat, je doit exécuter une tâche asynchrone et l'utilisation des résultats dans d'autres sous-tâches.

La "Récursive Fun House" m'a aidé à ramener la question à présent - de l'original de boucle récursive est de continuer sur une valeur non définie comme le sous-tâches sont toujours en cours d'exécution.

La Fun House - boucles autour de la collecte des nombres aléatoires entre (-99) et 99. Une fois la dernière différence entre le dernier chiffre et le nouveau nombre est positif, le plaisir est plus

L'impression de "Fait ici 1...il Fait ici 6" devrait indiquer que le sous-tâches ont été traitées correctement et nous avons une valeur pour la prochaine boucle.

Actuelle, il imprime 1,2,3,6,4,5 🙁

recursiveFunHouse.js

var recursiveFunHouse = function(num){
    console.log("Made it here 1");
    var newNum = performSideTasks();

    console.log("Made it here 6");
    console.log("newNum");
    console.log(newNum);
    if(newNum-num >0 ){
            recursiveFunHouse(newNum);
    }
    else{
        console.log("The FunHouse Generated These Numbers :")
      for(var i = 0; i <numList.length; i++){
         console.log(numList[i]);
      }
    }

};

var performSideTasks = function(){
    console.log("Made it here 2");
    someAsyncTask().then(function(num){
            anotherTask(num);
      console.log("made it here 5");
      return num;
        });


}

var someAsyncTask = function(){
  return new Promise (function(resolve, reject) {
    console.log("made it here 3");
    var randNum = Math.floor(Math.random()*99) + 1; 
    randNum *= Math.floor(Math.random()*2) == 1 ? 1 : -1;   

    setTimeout(function() { 
      numList.push(randNum)
      resolve(randNum)
    }, 100);
  });
}




var anotherTask = function(num){
  console.log("made it here 4");
    console.log(num);

};

var numList= [];

recursiveFunHouse(20);

Note - Pardonnez ma pathétique instruction de retour return num; Cela montre juste ce que je souhaite que je pourrais dire à mon ordinateur.

Questions au Sujet de la Récursivité et de Promesses:

1) dois-je être inquiet, en premier lieu, allez dans la prochaine boucle récursive avec une promesse pas encore résolu?

2) Si non, quel est un moyen propre à maintenir cette fonction de la décomposition et de la force de chaque boucle récursive d'attendre la résolution du dernier appel?


La récursivité et les Promesses peuvent sembler assistant-niveau-95 magique parfois... c'est tout ce que je dis. Question-Fait.

performSideTasks doit retourner le someAsynTask Promesse elle-même, de sorte que la principale fonction peut obtenir le nombre de valeur à l'intérieur .alors()

OriginalL'auteur Nick Pineda | 2016-01-10