例如,假设我正在使用拍卖API。我有一个订阅功能,可以用来获取有关潜在买家姓名及其相应出价的实时数据。
当订阅频道(auctionAPI.subscribe)上发生很多事情时,我很难让函数只能在“ if statements”内部执行一次。
如果名称Mike在短时间内出现两次,则第一个“如果陈述”将执行两次。我了解,当API发送数据时,我放置在auctionAPI.subscribe中的所有代码都将执行,但是为什么原始布尔值不起作用?
let value = 1;
auctionAPI.subscribe((data) => {
if (value === 1) {
if (data.Name == "Mike" && data.price >= 300) {
//do something
value = 2
}
}
if (value === 2) {
if (data.Name == "Charlotte" && data.price >= 1000) {
//do something
value = 3
}
}
});
目前的示例代码似乎应该可以正常工作。我要提请注意的是,您不会在订阅处理程序内部的任何地方错误地用“ let”重新定义“ value”,因为这实际上会重新定义范围并导致其不影响外部“ value”。
我知道这不是被问到的,但是如果要限制呼叫的处理,则可以这样做。每个“名称”将限制每500ms最多处理一次呼叫(希望这是唯一键)
//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(() => {
doSomething(scheduled[data.Name].data);
delete scheduled[data.Name];
}, 500)
};
}
}
auctionAPI.subscribe(throttleByName);