Задача

Реализуйте функцию throttle(fn, delay, ctx) — «троттлинг», которая возвращает обёртку, вызывающую fn не чаще, чем раз в delay миллисекунд. В качестве контекста исполнения используется ctx. Первый вызов fn всегда должен быть синхронным. Если игнорируемый вызов оказался последним, то он должен выполниться.

Пример

function test() {
    const start = Date.now();
 
    function log(text) {
        const msPassed = Date.now() - start;
        console.log(`${msPassed}: ${this.name} logged ${text}`);
    }
 
    const throttled = throttle(log, 100, { name: "me" });
 
    setTimeout(() => throttled("m"), 0);
    setTimeout(() => throttled("mo"), 22);
    setTimeout(() => throttled("mos"), 33);
    setTimeout(() => throttled("mosc"), 150);
    setTimeout(() => throttled("moscow"), 400);
 
    // Ожидаемый вывод:
    // 0ms: me logged m
    // 100ms: me logged mos
    // 200ms: me logged mosc
    // 400ms: me logged moscow
}

Решение

См. также