Read the statement by Michael Teeuw here.
Need help in Javascript for resetting module if user no longer interacts after x seconds.
-
I am using a Sonar module on Raspberry Pi to indicate whether someone is in front of the mirror or not. I use MMM-websocket to transfer this information to MagicMirror and it works correctly. Now, when there is nobody in front of the mirror for x seconds, I would like to call a function to reset the module. However, I got an issue on Javascript side:
Currently I have this function for resetting in my module:
userNoLongerInFrontSoReset: function(){ if (this.resetTimeout != null){ clearTimeout(this.resetTimeout); } this.resetTimeout = setTimeout(function(){ console.log("resetTimeout setTimeout"); this.myVar = null; this.myVar2 = null; this.myVar3 = null; this.sendNotification("PAGE_CHANGED", 0); this.updateDom(); }, 3000) }I see from the console that
resetTimeout setTimeoutis being printed out from the code above, but then it got:Uncaught TypeError: this.sendNotification is not a function at myOwnModule.js:xxxSo
thisis the problem. All those variablesmyVar, etc. are not being referred correctly as well as the functionsendNotification. How can I set allmyVarand callsendNotificationfrom the anonymous function in this case? Or is there a better way to do this?Thank you,
-
@jchariot
Change this;this.resetTimeout = setTimeout(function(){ ... this.sendNotification("PAGE_CHANGED", 0); this.updateDom(); ...to this;
this.resetTimeout = setTimeout(()=>{ ... this.sendNotification("PAGE_CHANGED", 0); this.updateDom(); ...Or this;
var module = this this.resetTimeout = setTimeout(function(){ ... module.sendNotification("PAGE_CHANGED", 0); module.updateDom(); ...Inside of
function(){...},thiswill be function itself, so you cannot accessthis- referer to module - of upper level.
To avoid, you can use ES6 style anonymous function()=>{}insteadfunction(){}or assign priorthisto another temporal object. -
@sean or
this.resetTimeout = setTimeout(function(){ ... this.sendNotification("PAGE_CHANGED", 0); this.updateDom(); ... }.bind(this));
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login