Реализация функции callAfter, которая позволяет вызывать любую функцию по истечении заданного времени.

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

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

Пример: Допустим, у вас есть функция под названием «сумма», например:

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

Теперь вы сможете выполнить: sum.callAfter(5000, 8, 9);

который должен вызвать функцию «сумма» через 5 секунд с параметрами 8 и 9.


person Swapnil Rai    schedule 19.07.2017    source источник
comment
Используйте тайм-аут. w3schools.com/js/js_timing.asp   -  person Etherealm    schedule 19.07.2017
comment
Возможный дубликат Как я могу передать параметр в setTimeout () обратный вызов?   -  person Etherealm    schedule 19.07.2017
comment
Звучит как вопрос интервью/домашнего задания. что ты уже испробовал?   -  person lxe    schedule 19.07.2017
comment
@lxe Наконец-то получил решение с использованием прототипирования функций.   -  person Swapnil Rai    schedule 20.07.2017
comment
Переопределение прототипа функции удобно, но некоторые считают его анти-шаблоном.   -  person lxe    schedule 20.07.2017


Ответы (1)


Получил это с помощью прототипирования функций:

Function.prototype.callAfter = function(){
    if(arguments.length > 1){
        var args = Array.prototype.slice.call(arguments);
        var time = args.splice(0,1);
        var func = this;
        setTimeout(function(){
            func.apply(null, args);
        }, time);
    }

}

person Swapnil Rai    schedule 19.07.2017
comment
Хороший ответ, но, как примечание, он не одобряет настройку прототипа собственных объектов JavaScript. Это работает, но также может вызвать проблемы, когда дело доходит до поддержки кода и включения библиотек. - person zfrisch; 20.07.2017
comment
@zfrisch Верно. Можете ли вы показать мне лучшее решение? На самом деле, я ищу лучший подход. - person Swapnil Rai; 20.07.2017