基于一定的时间延迟执行功能并忽略其他功能执行

基于一定的时间延迟执行功能并忽略其他功能执行

问题描述:

我在摆弄setTimeOut javascript函数。我有5个不同时间延迟的函数调用。我想要的只是执行那些每个函数之间有500毫秒延迟差异的函数。我创建了一个小提琴(https://jsfiddle.net/vt7sanav/)。有人可以建议我该怎么做来检查两个函数之间的延迟是500毫秒,然后执行函数否则忽略该函数。基于一定的时间延迟执行功能并忽略其他功能执行

示例:Packet1进入,应该立即发送(打印),等待500ms,并在500ms内忽略新的消息(函数调用)。只打印中间有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) 
+0

JavaScript是天生台异步。你正在寻找一个'承诺'。 –

+0

我认为我们可以在makeRequestThrottled调用中使用setTimeout来做到这一点,但不知道如何使用 – zubairm

来考虑做什么,我想正在试图做的是增加一个变量,ignoring,该makeRequestThrottled()功能将使用来确定消息是否正在被忽略了第一种方式。如果没有,张贴讯息,设定ignoring = true,并设置为500ms后设置ignoringfalse超时:

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>

+0

。谢谢 – zubairm