-1
votes

JavaScript bonne pratique pour exécuter de nombreuses fonctions / objet un à un à un jusqu'à la recherche de résultat

Quelle serait la bonne pratique d'exécuter de nombreux objets JavaScript un après un autre comme un pipeline / chaîne. Lorsque correspondez le code de sortie trouvé et le résultat de retour.

p>

        function a() {
            // found result 
            // if not found return false
            if (2===3){
                return 'result A';
            }else {
                return false;
            }
        }
        function b() {
            // If a() False
            // True = Match Result
            if (true){
                return 'result B';
            }else {
                return false;
            }
        }
        function c() {
            // if not found in b() find here
            if (true){
                return 'result C';
            }else {
                return false;
            }
        }
        function aibot() {
            return a() || b() || c(); // Some more function
        }
        console.log(aibot());


7 commentaires

Ceci est assez large comme demandé; Il y a un nombre de façons que cela puisse être manipulé.


Ils ne sont pas aussi asynchrones, une promesse ne vient pas vraiment en jeu ici. Il suffit de faire une gamme de références de fonction, d'itérer le tableau et d'appeler l'itérateur (la fonction). Êtes-vous Attendez-vous Toute de ces fonctions que vous souhaitez que votre pipeline soit aussi asynchrone?


L'exemple que vous avez écrit est assez clair et dans la même situation que j'irais pour cela. Mais comme le commentaire supérieur, tout dépend de la façon dont vous voulez gérer


@ zero298 Pouvez-vous faire un exemple?


Veuillez préciser l'attente d'abord parce que cela affectera la mise en œuvre. Si cette affaire avec des fonctions asynchrones.


Ce ne seront pas des fonctions asynchrones.


J'utilise la promesse uniquement pour exécuter aibot () . var label = nouvelle promesse (fonction (résolution, rejet) {resolve (AIBOT (fonctionnalité));}). ensuite (fonction (résultat) {console.log (résultat);});


4 Réponses :


1
votes

Vous pouvez utiliser . Trouver () Code> Pour renvoyer la première fonction de retour non-Falsy, puis exécutez-la à nouveau pour obtenir son résultat. Bien sûr, vous aimeriez probablement avoir une baisse dans le cas où toutes vos fonctions renvoient des valeurs de FALSY.

p>

const a = () => false;
const b = () => false;
const c = () => "Hello world";

var aibot = [a, b, c].find(f => f()) || (() => false);
console.log(aibot());


0 commentaires

5
votes

Vous pouvez prendre certains code> et une gamme de fonctions, ainsi qu'une valeur comme valeur de retour si une fonction renvoie une valeur de la vérité.

p>

function a() { return false; }
function b() { return 'result B'; }
function c() { return 'result C'; }

function aibot() {
    var value;
    [a, b, c].some(fn => value = fn());
    return value;
}

console.log(aibot());


5 commentaires

C'est vraiment sympathique. Je serais tenté de revenir valeur || indéfini , mais l'OP n'est pas explicite sur ce que la valeur de retour devrait être si aucun match n'est trouvé.


Si aucun match ne renvoie faux


Si votre fonction renvoie false par défaut, alors prenez-la comme ci-dessus, sinon renvoyez le résultat de quelques ou valeur , comme retourner [a, b, c] .Some (fn => valeur = fn ()) && valeur;


@TyLerroperPer ne certains () arrêtez-vous sur la première vraie valeur?


@Shaponpal, pour tous les appels identiques ou différents paramètres?



1
votes

Je pense que parfois vous êtes mieux avec une boucle simple. Cela ne fonctionnera que jusqu'à la première fonction qui retourne true et retournera cette valeur sans avoir à appeler la fonction. Il retournera non défini code> si aucune fonction ne renvoie une valeur de la vérité. Vous devrez considérer si toutes les valeurs de non-vérité (comme 0 code>) doivent être ignorées:

p>

function a() { return false}
function b() {return 'result B'}
function c() { return 'result C'}

function takeFirst(arr){
    for (let f of arr) {
        let r = f()
        if (r) return r
    }
}

console.log(takeFirst([a, b, c]))


0 commentaires

0
votes
function findFirstMatchingResult(arr, val){
  for(let i = 0, len = arr.length; i < len; i++){
    const result = arr[i]();
    if(result === val){
      return true;
    }
   }

   return false;
}


// if you really want to make it generic, you could do the following:

function findFirstMatchingResult(arr, val){
  return function(...params){
    for(let i = 0, len = arr.length; i < len; i++){
      const result = arr[i].apply(null, params[i]);
      if(result === val){
        return true;
      }
     }

     return false; 
  }
}

findFirstMatchingResult([
 function(str){
   return str.length;
 }
])([
 'hello'
]);

The generic version(Functions can have arguments) is definitely a little cumbersome having to pass an array for each function, but it's a good starting point. It would also only would for primitives. As === will not work for array, objects, etc.

0 commentaires