I am working on an application where I am making different window.postMessage() requests to pass messages. When I listen to a message with window.addEventListener('message', cb) I call another function, but some times I receive multiple calls to the function because it depends on how many times I post the message. I created a simple throttle function, which works well, but not for function calls. For instance, let's say when three times the function is called within 1000ms, the function should be called once and not three.
I am wondering this is the expected behavior, but in my case, the function is called three times.
I have used the throttle function from this answer, also this is the example fiddle I have created to see what I mean.
function throttle(func, wait, options) {
var context, args, result;
var timeout = null;
var previous = 0;
if (!options) options = {};
var later = function () {
previous = options.leading === false ? 0 : Date.now();
timeout = null;
result = func.apply(context, args);
if (!timeout) context = args = null;
};
return function () {
var now = Date.now();
if (!previous && options.leading === false) previous = now;
var remaining = wait - (now - previous);
context = this;
args = arguments;
if (remaining <= 0 || remaining > wait) {
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
previous = now;
result = func.apply(context, args);
if (!timeout) context = args = null;
} else if (!timeout && options.trailing !== false) {
timeout = setTimeout(later, remaining);
}
return result;
};
}
document.getElementById("btn").addEventListener(
"click",
throttle(function () {
console.log("BUTTON CLICKED");
}, 1000)
);
window.addEventListener("message", ({ data }) => {
if (data.type === "viewer:clear:cache") {
throttle(test(), 1000);
}
});
function test() {
console.log("TEST CALLED");
}
for (let i = 0; i < 5; i++) {
window.postMessage({ type: "viewer:clear:cache" }, "*");
}
<button id="btn">CLICK ME</button>