Randomize setInterval ( Hoe te herschrijven dezelfde willekeurige na de willekeurige interval)

Ik zou graag willen weten hoe te bereiken:
het genereren van een random number na een willekeurige tijd. En opnieuw gebruiken.

function doSomething(){
     //... do something.....
}

var rand = 300; //initial rand time

i = setinterval(function(){

     doSomething();
     rand = Math.round(Math.random()*(3000-500))+500; //generate new time (between 3sec and 500"s)

}, rand); 

En doe het herhaaldelijk.

Zo ver was ik in staat om het genereren van een willekeurige interval, maar het laatste hetzelfde totdat de pagina is vernieuwd (het genereren dan een verschillende tijd – interval).

Dankzij

 

4 Replies
  1. 86

    Hier is een echt schone en heldere manier om het te doen:

    http://jsfiddle.net/Akkuma/9GyyA/

    function doSomething() {}
    
    (function loop() {
        var rand = Math.round(Math.random() * (3000 - 500)) + 500;
        setTimeout(function() {
                doSomething();
                loop();  
        }, rand);
    }());

    EDIT:

    Uitleg:
    loop alleen bestaat binnen de direct aangeroepen functie context, dus het kan recursief gesprek zelf.

    • Mooie oplossing, maar het vereist een aantal wijzigen als u wilt in staat zijn om te verwijderen “interval” in een tijdje.
    • als u wilt stoppen met looping, plaats gewoon een if-instructie om de setTimeout met de logica die je nodig hebt.
    • Sorry, opgraven dit antwoord zo veel jaar na, maar ik heb een vraag : zal het niet je hebt een stapel van uitvoering van de context die ervoor zorgen dat het verhogen zonder einde met deze oplossing ?
    • Vond ik een mooie uitleg over waarom het niet maken van een stapel van uitvoering context : stackoverflow.com/a/13506904/1951430
    • Hier is een eenvoudige NPM pakket gooide ik samen om dit een moeiteloos proces: npmjs.com/package/set-random-interval
    • het doet stapel uitvoering contexten. Je hebt gelijk.

  2. 5

    Iets zoals dit zou moeten werken – gebruik setTimeout() in plaats, zodat u kunt een nieuwe willekeurige waarde elke keer:

    function doSomething() {
        alert("doing something");
    }
    
    function init() {
        var myFunction = function() {
            doSomething();
            var rand = Math.round(Math.random() * (3000 - 500)) + 500; //generate new time (between 3sec and 500"s)
            setTimeout(myFunction, rand);
        }
        myFunction();
    }
    
    $(function() {
        init();
    });

    Werken jsFiddle hier.

    • Ja op die manier kun je een update van de willekeurige interval elke keer
    • Dat is jQuery aan het eind, niet normaal Javascript.
    • Hoe kunt u doorgeven argumenten met deze methode?
  3. 4

    Instellen interval elke keer dat u de rand (en duidelijk het eerst)

    function doSomething(){
         //... do something.....
    }
    
    var i;
    var rand = 300;
    
    function randomize() {
        doSomething();
        rand = Math.round(Math.random()*(3000-500))+500; 
        clearInterval(i);
        i = setInterval('randomize();', rand);
    }
    
    i = setInterval('randomize();', rand);

    of proberen met behulp van setTimeout (en opnieuw instellen na randing)

    • Op een zijde nota moet worden setInterval(randomize, rand);
  4. 1

    Gewoon het gooien van mijn hoed in de ring

        var keepLooping = true;
        (function ontimeout(){
            if(keepLooping){
                doTheAction();
                setTimeout(ontimeout, Math.random() * 100);
            }
        })();

    afhankelijk van of u wilt doTheAction() in de setTimeout terugbellen of niet. Ik vind het fijn om het voor/buiten. Als u wilt de aanvankelijke vertraging, toen in, indien niet, zet hem buiten voor de eenvoud.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *