JavaScript: создать функцию, которая принимает обратный вызов в качестве ввода и возвращает функцию;Выход зависит от количества вызовов - PullRequest
0 голосов
/ 11 июня 2019

Цель моего кода:

Напишите функцию «один раз», которая принимает обратный вызов в качестве входных данных и возвращает функцию. Когда возвращаемая функция вызывается в первый раз, она должна вызвать обратный вызов и вернуть этот вывод. Если он вызывается в любое дополнительное время, вместо повторного вызова обратного вызова он просто вернет выходное значение с момента первого вызова.

Я попробовал код ниже:

const once = (inputFunc) => {

  let invCount = 0; 
  let firstCallOutput; 

  return function (num) {
    invCount ++; 

    if (invCount === 1){

      firstCallOuput = inputFunc(num); 
      return inputFunc(num); 
    }

    else {
      return firstCallOuput; 
    }
  }
}

const addByTwoOnce = once(function(num) {
  return num + 2;
});


// UNCOMMENT THESE TO TEST YOUR WORK!
console.log(addByTwoOnce(5));  //should log 7
console.log(addByTwoOnce(10));  //should log 7
console.log(addByTwoOnce(9001));  //should log 7

Консоль моего кода записывает правильные значения (7) во всех трех ситуациях. Но он не проходит 2/3 спецификации теста.

enter image description here

Что я делаю не так? Как я могу пройти две спецификации теста?

1 Ответ

1 голос
/ 11 июня 2019

Вот упрощенная функция once -

const once = (f, memo) => x =>
  memo === undefined
    ? (memo = f(x), memo)
    : memo

const addTwo = x =>
  x + 2

const addTwoOnce =
  once(addTwo)

console.log(addTwoOnce(5))  //should log 7
console.log(addTwoOnce(10))  //should log 7
console.log(addTwoOnce(9001))  //should log 7

Если вы хотите защитить сайт вызова от возможности установить памятку, вы можете сделать памятку локальной переменной вместо параметра -

const once = f =>
{ let memo
  return x =>
    memo === undefined
      ? (memo = f(x), memo)
      : memo
}

Или, возможно, вы хотите защитить от потенциальной возможности возврата предоставленной пользователем функции undefined. Это все варианты, которые вы можете сделать с минимальным влиянием на семантическую структуру кода -

const once = f =>
{ let hasRun = false
  let memo
  return x =>
    hasRun
      ? memo
      : (hasRun = true, memo = f(x), memo)
}

Related: constant вернет значение constant независимо от его ввода -

const constant = x => _ =>
  x

const always7 =
  constant(7)

console.log(always7(5))  //should log 7
console.log(always7(10))  //should log 7
console.log(always7(9001))  //should log 7

Related: memoise будет кешировать значение для каждого уникального ввода , только пересчитывая f, если ввод ранее не просматривался -

const memoise = (f, memo = new Map) => x =>
  memo.has(x)
    ? memo.get(x)
    : (memo.set(x, f(x)), memo.get(x))
    
let fib = n => 
  n < 2
    ? n
    : fib (n - 1) + fib (n - 2)
  
console.time("original")
console.log(fib(40))
console.timeEnd("original")
// 1503.43 ms

fib = memoise(fib)

console.time("memoised")
console.log(fib(40))
console.timeEnd("memoised")
// 0.175 ms
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...