根据一定的时间延迟执行函数,而忽略其他函数的执行



我在摆弄setTimeOut javascript函数。我有5个不同时延的函数调用。我想要的是只执行那些每个函数之间有500ms延迟差的函数。我创造了一把小提琴(https://jsfiddle.net/vt7sanav/)。有人能建议我应该做什么来检查两个函数之间的延迟是500ms,然后执行该函数吗?否则忽略该函数。

示例:Packet1进入,应立即发送(打印),等待500毫秒,在500毫秒内,忽略新消息(函数调用)。仅打印其间延迟500毫秒的消息。

function postMessage(msg) {
$("#msgBox").append("n" + msg + " time:" + new Date().getSeconds() + ":" + new Date().getMilliseconds());
}
function makeRequest(msg) {
postMessage(msg);
}
function makeRequestThrottled(msg) {
// Packet1 comes in, should be sent straight away. wait 500ms and within 500ms,      ignore new msgs.
postMessage(msg);
}
function sendMessage(msg, delay) {
setTimeout(() =>
makeRequestThrottled(msg), delay);
}
sendMessage("Packet1", 200);  //This should be printed straight away
sendMessage("Packet2", 600);   //Shouldn't be printed, difference is 400ms (Packet2 -Packet1)
sendMessage("Packet3", 1800);  // Should be printed, difference > 500ms (Packet3 -Packet2)
sendMessage("Packet4", 2400);  //Should be printed, difference > 500ms (Packet4 -Packet3)
sendMessage("Packet5", 2600);  //Shouldn't be printed, difference < 500ms (Packet4 -Packet5)

我认为您要做的第一种方法是添加一个变量ignoringmakeRequestThrottled()函数将使用该变量来确定消息当前是否被忽略。如果没有,则发布消息,设置ignoring = true,并设置超时,在500ms:后将ignoring设置回false

function postMessage(msg) {
$("#msgBox").append("<li>" + msg + " time:" + new Date().getSeconds() + ":" + new Date().getMilliseconds());
}
function makeRequest(msg) {
postMessage(msg);
}
var ignoring = false;
function makeRequestThrottled(msg) {
// Packet1 comes in, should be sent straight away. wait 500ms and within 500ms,      ignore new msgs.
if (!ignoring) {
postMessage(msg);
ignoring = true;
setTimeout(() => { ignoring = false }, 500);
}
}
function sendMessage(msg, delay) {
setTimeout(() =>
makeRequestThrottled(msg), delay);
}
sendMessage("Packet1", 200);  //This should be printed straight away
sendMessage("Packet2", 600);   //Shouldn't be printed, difference is 400ms (Packet2 -Packet1)
sendMessage("Packet3", 1800);  // Should be printed, difference > 500ms (Packet3 -Packet2)
sendMessage("Packet4", 2400);  //Should be printed, difference > 500ms (Packet4 -Packet3)
sendMessage("Packet5", 2600);  //Shouldn't be printed, difference < 500ms (Packet4 -Packet5)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul id="msgBox"></ul>

最新更新