Хорошая практика JavaScript - запускать много функций / объектов по одному, пока не найдете результат - PullRequest
0 голосов
/ 16 января 2019

Что было бы хорошей практикой для выполнения многих объектов JavaScript один за другим, как конвейер / цепочка. При совпадении найден код выхода и результат возврата.

        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());

js Promise Было бы хорошим решением? Пожалуйста, дайте предложение.

Ответы [ 4 ]

0 голосов
/ 16 января 2019
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'
]);

Обобщенная версия (у функций могут быть аргументы) определенно немного громоздка, когда нужно передавать массив для каждой функции, но это хорошая отправная точка. Это также было бы только для примитивов. Так как === не будет работать для массива, объектов и т. Д.

0 голосов
/ 16 января 2019

Вы можете взять some и массив функций, а также значение в качестве возвращаемого значения, если функция возвращает истинное значение.

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());
0 голосов
/ 16 января 2019

Я думаю, что иногда вам лучше с простой петлей.Это будет работать только до тех пор, пока первая функция не вернет true и вернет это значение без необходимости повторного вызова функцииОн вернет undefined, если ни одна функция не вернет истинное значение.Вам нужно будет рассмотреть, следует ли игнорировать все неверные значения (например, 0):

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 голосов
/ 16 января 2019

Вы можете использовать .find(), чтобы вернуть первую функцию, не возвращающую ложь, и затем запустить ее снова, чтобы получить ее результат. Конечно, вы, вероятно, хотели бы иметь запасной вариант в случае, если все ваши функции возвращают ложные значения.

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

var aibot = [a, b, c].find(f => f()) || (() => false);
console.log(aibot());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...