GitHub | Documentation | Discord (chat) | Become a Patron

'random' clock timing



  • I'm trying to create some 'bot' players in my game (controlled server-side) that act at 'random' times.
    My concept was to fire a clock.setTimeout() with a random time, that calls the 'botActions' function, and at the end of that function calls itself again using another setTimeout with a different 'random' time.
    However, within the first this.clock.setTimeout, I can't seem to access this.clock.setTimeout... "this" is undefined...
    Scope issue, I assume...? Is there a more 'proper' way to accomplish this?
    Thanks!
    David

    without random time

    botUpdate(data){
            console.log("bot clock tick:", data);
            this.clock.setTimeout(this.botUpdate, 1000, {botID : data.botID});
    }
    

    this.clock.setTimeout(this.botUpdate, 1000, {botID : data.botID});
    TypeError: Cannot read property 'setTimeout' of undefined


  • administrators

    Hi @davidhoare, welcome!

    This is the classical mistake regarding the this scope in JavaScript, no worries, everyone's been there! Here's a related discussion in the forum.

    To preserve the this scope in JavaScript, you can either use this.botUpdate.bind(this), or create an arrow function.

    Examples:

    // using Function.prototype.bind
    this.clock.setTimeout(this.botUpdate.bind(this), 1000, {botID : data.botID});
    
    // using arrow functions (block)
    this.clock.setTimeout(() => {
        this.botUpdate();
    }, 1000, {botID : data.botID});
    
    // using arrow functions (single line; shorthand)
    this.clock.setTimeout(() => this.botUpdate(), 1000, {botID : data.botID});
    

    Hope this helps! Happy holidays!