Задержка-выполнение любой существующей функции с помощью вызова вида "имя_функции.callAfter (ms, param1, param2, ...)" - PullRequest
0 голосов
/ 29 марта 2020

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

Напишите реализацию функции callAfter, которая позволяет вызывать ЛЮБУЮ функцию через некоторое заданное время. Вывод функции должен оставаться неизменным. Функция должна иметь> следующий синтаксис:

Пример 1: Допустим, у вас есть функция с именем sum примерно так:

function sum(a, b) {
 console.log('Sum is: ', a + b);
}

Теперь вы должны иметь возможность выполнить:

sum.callAfter(5000, 8, 9);

Это должно вызвать функцию sum через 5 секунд с параметрами 8 и 9. Вывод: 'Sum is: 17'.

Пример 2: Для функции difference со следующей реализацией:

function difference(a, b) {
  console.log('Difference is: ', a-b);
}

Вы должны быть в состоянии выполнить:

difference.callAfter(4000, 8, 6);

Это должно вызвать функцию difference через 4 секунды с параметрами 8 и 6. Вывод: «Разница: 2».

ПРИМЕЧАНИЕ. Я знаю, что могу выполнить функцию через n секунд, используя что-то вроде:

var delay_func = (function(){
  var timer = 0;
  return function(callback, ms){
    clearTimeout (timer);
    timer = setTimeout(callback, ms);
  };
})();

Однако меня попросили присоединить callAfter «подфункцию» к каждой функции для облегчения вызова:

<function_name>.callAfter(milliseconds, param1, param2, ...);

Ответы [ 3 ]

4 голосов
/ 29 марта 2020

Мы знаем, что если мы добавим функцию к Function.prototype, она будет вызываться для всех функций. Поэтому мы используем этот код:

Function.prototype.callAfter = function (time, ...params) {
  setTimeout(this(...params), time);
}

Теперь любая определенная функция имеет метод callAfter.

Например:

function sum(a, b) {
  console.log('Sum is: ', a + b);
}

sum.callAfter(500, 3, 2) // output => Sum is: 5

Или:

function difference(a, b) {
  console.log('Difference is: ', a-b);
}

difference.callAfter(500, 3, 2) // output => Difference is: 1
1 голос
/ 29 марта 2020

Вы можете сделать это, добавив метод к объекту-прототипу конструктора функции. Таким образом, любая созданная функция может наследовать этот метод. Это упоминается как прототип наследования . Не забывайте скобки параметров в функции setTimeout():

Function.prototype.callAfter = function(delay, ...args) {
    setTimeout(() => this(...args), delay)
};
1 голос
/ 29 марта 2020

Если я четко понял задачу, вы должны использовать Function.prototype . Прототип функции помогает вам реализовать функцию, которую можно будет использовать для каждой функции, к которой прикреплен ваш код.

Function.prototype.callAfter = function(delay = 4, arg1, arg2) {
    setTimeout(() => {
        return  this.call(null,  arg1, arg2);
    }, delay)}


function summ ( arg1, arg2){
    console.log('summ',  arg1 + arg2);};


summ.callAfter(500, 5,6)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...