Randomize setInterval ( How to rewrite same random after random interval)

后端 未结 5 2083
既然无缘
既然无缘 2020-11-29 22:18

I\'d like to know how to achieve: generate a random number after a random number of time. And reuse it.

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


        
相关标签:
5条回答
  • 2020-11-29 22:44

    Just throwing my hat in the ring

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

    depends if you want to put doTheAction() inside the setTimeout callback or not. I think it's fine to put it before/outside. If you want the initial delay, then put it inside, if not, put it outside for simplicity.

    0 讨论(0)
  • Something like this should work - use setTimeout() instead so you can set a new random value each time:

    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();
    });
    

    Working jsFiddle here.

    0 讨论(0)
  • 2020-11-29 23:01

    Just setup interval each time you rand (and clear it first)

    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);
    

    or try using setTimeout (and setting again after randing)

    0 讨论(0)
  • 2020-11-29 23:04

    Here's a reusable version that can be cleared. Open-sourced as an NPM package with IntelliSense enabled.

    Utility Function

    const setRandomInterval = (intervalFunction, minDelay, maxDelay) => {
      let timeout;
    
      const runInterval = () => {
        const timeoutFunction = () => {
          intervalFunction();
          runInterval();
        };
    
        const delay = Math.floor(Math.random() * (maxDelay - minDelay + 1)) + minDelay;
    
        timeout = setTimeout(timeoutFunction, delay);
      };
    
      runInterval();
    
      return {
        clear() { clearTimeout(timeout) },
      };
    };
    

    Usage

    const interval = setRandomInterval(() => console.log('Hello World!'), 1000, 5000);
    
    // // Clear when needed.
    // interval.clear();
    
    0 讨论(0)
  • 2020-11-29 23:08

    Here is a really clean and clear way to do it:

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

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

    EDIT:

    Explanation: loop only exists within the immediately invoked function context, so it can recursively call itself.

    0 讨论(0)
提交回复
热议问题