пример закрытия с использованием setTimeout, не распознающего вызов функции - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь создать небольшое приложение, которое закрывается функцией delay и определяет новую функцию, используя обратный вызов и время ожидания. Затем я хотел использовать эту вновь созданную внутреннюю функцию setTimeout, чтобы получить один параметр, который будет запущен в обратном вызове после времени ожидания.

function addTwo(num) {
  return num + 2
}

const delay = (callback, wait) => {
  return setTimeout((value) => callback(value), wait)
}
var delayAddByTwo = delay(addTwo, 100)
console.log(delayAddByTwo(6))
// expected result 8 
// actual result --- Uncaught TypeError: delayAddByTwo is not a function

Насколько я могу судить после delayAddByTwo = delay(addTwo, 100), единственный параметр, который нужно создать, - это value, переданный в функцию обратного вызова внутри 'внутренней' функции setTimeOut. Чего мне не хватает в закрытии в этом примере?

Ответы [ 3 ]

2 голосов
/ 30 января 2020

Вам нужно заменить var delayAddByTwo = delay(addTwo, 100) на var delayAddByTwo = (num) => { delay(() => {addTwo(num)}, 100);}

function addTwo(num) {
  console.log(num + 2)
  return num + 2
}

const delay = (callback, wait) => {
  setTimeout(callback, wait)
}
var delayAddByTwo = (num) => {
  delay(() => {addTwo(num)}, 100);
}
console.log(delayAddByTwo)
delayAddByTwo(6)
// expected result 8 
// actual result --- Uncaught TypeError: delayAddByTwo is not a function
0 голосов
/ 30 января 2020

Вам нужно сделать задержку возврата другой функцией, которая принимает n. Этот n представляет номер, который будет передан в addTwo (ie обратный вызов). setTimeout по умолчанию вернет timeoutID, поэтому вместо этого вы можете вернуть Promise , который разрешает результат вызова addTwo с n. Чтобы получить результат от Обещания, вы можете await его в функции async .

См. Пример ниже:

const addTwo = num => num + 2;
const delay = (callback, wait) => n => new Promise(res => setTimeout(res, wait, callback(n)));

(async () => {
  const delayAddByTwo = delay(addTwo, 1000);
  const res = await delayAddByTwo(6);
  console.log(res);
})();

Выше я использовал третий аргумент из setTimeout, который будет использоваться в качестве первого аргумента обратного вызова и передан res .

0 голосов
/ 30 января 2020

Изменить

var delayAddByTwo = delay(addTwo, 100)

На

const delayAddByTwo = delay => (addTwo, 100)
...