Пример кода в его нынешнем виде кажется, что он должен работать нормально. Я бы сказал, что будьте осторожны, что вы не ошибочно переопределяете 'value' с помощью 'let' где-нибудь внутри обработчика подписки, так как это на самом деле изменяет область действия и не будет влиять на внешнее 'value'.
Я знаю, что это не совсем то, о чем спрашивали, но если вы пытаетесь ограничить обработку вызовов, то как-то так будет. Это будет ограничивать обработку вызовов максимум один раз каждые 500 мс на «Имя» (возможно, это уникальный ключ)
//Just some setup code to call the delegate
let auctionAPI = {
subscribe: (delegate) => {
//Quick subsequent calls
delegate({ Name: 'A Name', price: 100 });
delegate({ Name: 'A Name', price: 300 });
delegate({ Name: 'A Name', price: 200 });
setTimeout(() => {
//Wait a second and quick subsequent calls
delegate({ Name: 'A Name', price: 600 });
delegate({ Name: 'A Name', price: 500 });
delegate({ Name: 'A Name', price: 300 });
}, 1000);
}
};
function doSomething(data) {
//Where you want to acutally do the real logic with the throttled calls
console.log(`Do something with ${JSON.stringify(data)}`);
}
let scheduled = {};
function throttleByName (data) {
if (scheduled[data.Name]) {
//Already scheduled to process
//-Make sure to use the latest data
//-Could be modified to keep the larger value
scheduled[data.Name].data = data;
} else {
scheduled[data.Name] = {
data: data,
timerId: setTimeout(() => {
let scheduledData = scheduled[data.Name].data;
delete scheduled[data.Name];
doSomething(scheduledData);
}, 500)
};
}
}
auctionAPI.subscribe(throttleByName);