Отметьте первый вызов до выполнения исходной функции; затем возвращайте undefined при любом повторном обращении.
1. Реализовать функцию-декоратор runOnce, которая принимает функцию и вызывает какую-нибудь. Новая функция может быть вызвана только один раз, все последующие вызовы возвращают undefined.
Отметьте первый вызов до выполнения исходной функции; затем возвращайте undefined при любом повторном обращении.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
-
Реализовать функцию-декоратор runOnce, которая принимает функцию и вызывает какую-нибудь. Новая функция может быть вызвана только один раз, все последующие вызовы возвращают undefined.
-
Оформленная функция может принимать аргументы и возвращать результат.
Ответ
Отметьте первый вызов до выполнения исходной функции; затем возвращайте undefined при любом повторном обращении.
Так сохраняются аргументы и this, а повторный вход из самой функции не запускает её ещё раз.
function runOnce(fn) {
let called = false;
return function (...args) {
if (called) return undefined;
called = true;
return fn.apply(this, args);
};
}
Первый результат возвращается только первому вызову, не кешируется для следующих. Даже если функция бросила ошибку или вернула отклонённый Promise, повторного запуска по этому контракту нет.