JavaScript一个接一个地运行多个函数/对象直到找到结果的良好实践

JavaScript一个接一个地运行多个函数/对象直到找到结果的良好实践,javascript,promise,artificial-intelligence,Javascript,Promise,Artificial Intelligence,像管道/链一样一个接一个地执行许多JavaScript对象是一种好的做法。当匹配找到退出代码并返回结果时 功能a{ //发现结果 //如果没有找到,返回false 如果2==3{ 返回“结果A”; }否则{ 返回false; } } 功能b{ //如果一个错误 //真=匹配结果 如果是真的{ 返回“结果B”; }否则{ 返回false; } } 功能c{ //如果在b中找不到,请在此处查找 如果是真的{ 返回“结果C”; }否则{ 返回false; } } 函数aibot{ 返回a | | b

像管道/链一样一个接一个地执行许多JavaScript对象是一种好的做法。当匹配找到退出代码并返回结果时

功能a{ //发现结果 //如果没有找到,返回false 如果2==3{ 返回“结果A”; }否则{ 返回false; } } 功能b{ //如果一个错误 //真=匹配结果 如果是真的{ 返回“结果B”; }否则{ 返回false; } } 功能c{ //如果在b中找不到,请在此处查找 如果是真的{ 返回“结果C”; }否则{ 返回false; } } 函数aibot{ 返回a | | b | | c;//更多函数 } console.logaibot 您可以使用返回第一个非falsy返回函数,然后再次运行它以获得结果。当然,如果所有函数都返回falsy值,您可能希望有一个回退

常数a==>false; 常数b==>false; 常量c==>你好,世界; var aibot=[a,b,c].findf=>f | |=>false; console.logaibot 如果函数返回truthy值,则可以将一些和一个函数数组以及一个值作为返回值

函数a{return false;} 函数b{返回'result b';} 函数c{返回'result c';} 函数aibot{ var值; [a,b,c].somefn=>value=fn; 返回值; }
console.logaibot 我想有时候你最好是简单的循环。这将只运行到第一个返回true的函数,并且将返回该值,而无需再次调用该函数。如果没有函数返回truthy值,它将返回undefined。您将需要考虑是否所有不可信的值如0都应该被忽略:

函数a{return false} 函数b{返回'result b'} 函数c{返回'result c'} 函数takeFirstarr{ 对于arr的let f{ 设r=f 如果r返回r } } 控制台.logtakeFirst[a,b,c]
泛型版本函数可以有参数,但必须为每个函数传递一个数组,这肯定有点麻烦,但这是一个很好的起点。它也只适用于原语。As===不适用于数组、对象等。

这是一个相当广泛的问题;有很多种方法可以解决这个问题。它们不是异步的,所以承诺在这里并不真正起作用。只需创建一个函数引用数组,迭代该数组,并将迭代器调用为函数。您希望管道中的任何函数都是异步的吗?您编写的示例非常清楚,在相同的情况下,我也会这样做。但作为最重要的评论,这完全取决于你想怎么做handle@zero298你能举个例子吗?请先澄清期望值,因为这会影响实施。这应该处理异步函数。这真的很好。我很想返回值| | undefined,但是OP没有明确说明如果没有找到匹配项,返回值应该是什么。如果没有匹配项返回false如果函数默认返回false,那么就如上所述,否则返回一些or值的结果,如return[a,b,c]。somefn=>value=fn&&value@TylerRoper不是在第一个真值上停止吗?@ShaponPal,对于所有相同或不同参数的调用?
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'
]);