2017-05-22 1 views
0

Je veux une file d'attente de fonctions d'implémentation, où elle doit être exécutée en fonction de la temporisation. Si l'une des fonctions de la file d'attente est invoquée avant le délai, la file d'attente ne doit pas exécuter cette fonction et doit être déplacée vers la fonction suivante de la file d'attente.File d'attente de fonction basée sur le temps

Par exemple:

function funQueue(message,date){ 

    //logic 
} 

var fn1=funQueue("message1",new Date().getTime()+500) 
var fn2=funQueue("message2",new Date().getTime()+1000) 
var fn3=funQueue("message3",new Date().getTime()+2000) 
    fn2() 

Lorsqu'il est exécuté comme ci-dessus, il faut imprimer.

message1

message3

s'il vous plaît noter message2 est pas imprimé.

Merci à tous,

+0

S'il vous plaît nous dire pourquoi 'var fn2' est pas exécuté? Vous ne pouvez pas dire si cette fonction sera appelée à nouveau – Justinas

+0

@Justinas - elle est exécutée ... voir 'fn2()' - qui l'exécute –

+0

Mais 'fn1' et' fn3' ne sont pas rappelés. Vous n'attribuez pas de fonction, vous attribuez la valeur de retour de fonction. Alors, quelle est la logique? – Justinas

Répondre

0

quelque chose comme ça pour vérifier si le temps est passé ou non

var timePassed; 
function funQueue(message, date){ 
    if(timePassed > date){ 
    timePassed = new Date.getTime(); 
    // Do stuff 
    } 
} 
2

Peut-être un petit quelque chose comme ce qui suit, en utilisant setTimeout() et clearTimeout():

function funQueue(message,date){ 
 
    var timeoutId = setTimeout(function() { // schedule a timeout 
 
    console.log(message)     // that logs the message 
 
    }, date - new Date().getTime())   // at the specified time 
 
    
 
    return function() {      // return a function 
 
    clearTimeout(timeoutId)    // that cancels the timeout 
 
    } 
 
} 
 

 
var fn1=funQueue("message1",new Date().getTime()+500) 
 
var fn2=funQueue("message2",new Date().getTime()+1000) 
 
var fn3=funQueue("message3",new Date().getTime()+2000) 
 
fn2()

Notez que si vous appelez funQueue() avec une heure qui est dans le passé, il appellera toujours setTimeout(), ce qui signifie que le message sera enregistré immédiatement après la fin du code actuel, à moins qu'il ne soit annulé dans le code actuel.

EDIT: J'ai été invité dans un commentaire à l'implémenter sans plusieurs délais d'attente simultanés. Ce qui suit est la première façon qui me vient à l'esprit. Je suis sûr que cela pourrait être rangé, optimisé, et/ou complètement réécrit d'une meilleure manière, mais cela a fonctionné la première fois que j'ai cliqué sur "courir" donc je pense que c'est un bon point de départ. Je vais laisser l'explication de la façon dont cela fonctionne comme un exercice pour le lecteur ...

var funQueue = function() { 
 
    var queue = [] 
 
    var timeoutId 
 
    function setNext() { 
 
    clearTimeout(timeoutId) 
 
    if (queue.length > 0) { 
 
     timeoutId = setTimeout(function() { 
 
     console.log(queue.shift().message) 
 
     setNext() 
 
     }, queue[0].date - new Date().getTime()) 
 
    } 
 
    } 
 
    return function(message,date){ 
 
    var item = { message: message, date: date } 
 
    var i = 0 
 
    while (i < queue.length && date >= queue[i].date) i++ 
 
    queue.splice(i, 0, item) 
 
    setNext() 
 
    return function() { 
 
     var i = queue.indexOf(item) 
 
     if (i != -1) { 
 
     queue.splice(i, 1) 
 
     setNext() 
 
     } 
 
    } 
 
    } 
 
}() 
 

 
var fn1=funQueue("message1",new Date().getTime()+500) 
 
var fn2=funQueue("message2",new Date().getTime()+1000) 
 
var fn3=funQueue("message3",new Date().getTime()+2000) 
 
var fn4=funQueue("message4",new Date().getTime()+1500) 
 
var fn5=funQueue("message5",new Date().getTime()+2000) 
 
fn2()

+0

Nice. Je pense que setTimeout en crée plusieurs instances, pouvons-nous le faire de telle sorte que nous ne pouvons avoir qu'une seule instance de setTimeout – flex

+0

L'appel 'setTimeout()' planifie un * single * timeout. Vous avez besoin d'un délai d'expiration par message, car chaque message a son propre délai et doit pouvoir être annulé indépendamment. Cliquez sur le "Run code snippet" bouton et voir le résultat par vous-même. – nnnnnn

+0

Je veux dire, si j'appelle funQueue trois fois, alors 3 timers seront commencés à droite? – flex