Карри с setTimeout - JS - PullRequest
1 голос
/ 20 марта 2020

Я хочу создать метод для Function prototype, который автоматически добавит setTimeout. Я получил это с этим:

Function.prototype.defer = function (delay) {
  setTimeout(this, delay);
};
    
function f() {
  console.log("Hello!");
}
    
f.defer(1000);

И теперь мне нужно передать параметры моей функции с помощью карри, как показано ниже:

function f(a, b) {
  console.log( a + b );
}

f.defer(1000)(4, 2);

И я достиг этого только с помощью карри, но не с setTimeout:

Function.prototype.defer = function (delay) {
  return this
};

function f(a,b) {
  console.log(a + b);
}

f.defer(1000)(4, 2);

Но когда я пытаюсь добавить setTimeout, он теряет этот или не распознает его как функцию.

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

Вы можете сделать это с изменением вашей .defer() функции:

    Function.prototype.defer = function (delay, ... args) {
      setTimeout(this.bind(undefined, ... args), delay);
    };
        
    function f(a, b) {
      console.log("a + b is " + (a + b));
    }
    
    f.defer(2000, 4, 5);
    
2 голосов
/ 20 марта 2020

Вам нужно вернуть другую функцию, которая будет захватывать и передавать аргументы.

Function.prototype.defer = function (delay) {
  return (...args) => setTimeout(this, delay, ...args)
};

function f(a,b) {
  console.log(a + b);
}

f.defer(1000)(4, 2);
console.log('test')

Или используя bind

Function.prototype.defer = function (delay) {
  return setTimeout.bind(null, this, delay)
};

function f(a,b) {
  console.log(a + b);
}

f.defer(2000)(4, 2);
console.log('test')
...