2017-10-12 6 views
0

Je tripote la fonction javascript setTimeOut. J'ai 5 appels de fonction avec un délai différent. Ce que je veux est d'exécuter seulement les fonctions qui ont une différence de retard de 500ms entre chaque fonction. J'ai créé un violon (https://jsfiddle.net/vt7sanav/). Quelqu'un peut-il suggérer ce que je devrais faire pour vérifier le délai entre deux fonctions est de 500 ms puis exécuter la fonction sinon ignorer la fonction. Exemple: Packet1 arrive, doit être envoyé (imprimé) immédiatement, attendre 500ms et dans les 500ms, ignorer les nouveaux msgs (appels de fonction). N'imprimez que les messages dont le délai est inférieur à 500 ms.Exécuter des fonctions en fonction d'un certain délai et ignorer l'exécution d'autres fonctions

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 est par nature asynchrone. Vous cherchez une «promesse». –

+0

Je pense que nous pouvons le faire en utilisant setTimeout à l'intérieur de l'appel makeRequestThrottled, mais pas sûr comment cela fonctionne – zubairm

Répondre

1

La première qui vient à l'esprit pour faire ce que je pense que vous essayez de faire est d'ajouter une variable, ignoring, que la fonction makeRequestThrottled() utilisera pour déterminer si les messages sont actuellement ignorés. Sinon, afficher le message, définissez ignoring = true et définir un délai qui définit ignoring retour à false après 500ms:

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

. Merci – zubairm