Ok, so I think i figured it out. Still not sure why it worked, but for some reason, running a console.log("descriptive text " + this) seems to corrupt or change the type of “this”. If I put two consecutive console.log() calls–first with descriptive text, second with just “this”–then it works. Basically in the example above, if I just comment out the first two console.log() calls, then it no longer prints “undefined” and instead prints “MSFT”. Sorry for all the trouble!
Read the statement by Michael Teeuw here.
Posts
-
RE: Stocks
-
RE: Stocks
@alexyak So that’s what I expected as well. Unfortunately, it is somehow getting messed up between the “socketNotificationReceived” function and the “getDom” function.
socketNotificationReceived: function(notification, payload) { if (notification === "STOCKS_RESULT") { this.result = payload; console.log(this.result); //prints my JSON correctly console this.updateDom(self.config.fadeSpeed); }
So the above works correctly. Below, however, it doesn’t seem to maintain and I can’t figure out why.
getDom: function() { var wrapper = document.createElement("table"); wrapper.className = 'normal regular small'; var count = 0; var _this = this; console.log("result is " + this.result); //prints "result is [object Object]" console.log("result length is " + this.result.length); //prints "result length is 0" console.log(this.symbol); //prints "undefined" }
I apologize if I’m being thick, but I can’t figure out why it’s not working…
-
RE: Stocks
Upon looking at it further-- in the “socketNotificationReceived: function(notification, payload)” function in the module.js file, it seems that when I run console.log(this.result), it outputs my JSON:
Object { symbol: “MSFT”, price: “62.30”, date: “12/16/2016”, time: “4:00pm”, change: “-0.28”, col1: “62.95”, high: “62.95”, low: “62.12”, col2: “42453083” }
When I go to the “getDom” function and run “console.log(this.result)”, I get:
[object Object]
I’m just not sure why that change occurs, but that seems to be my issue. Any help is massively appreciated!
-
RE: Stocks
@alexyak Sure…see below.
In the node_helper.js:
getStocks: function (url) {
var self = this;request({ url: url, method: 'GET' }, function (error, response, body) { if (!error && response.statusCode == 200) { var result = JSON.parse(body); console.log(result.query.results.row); //prints the JSON as expected to the terminal self.sendSocketNotification('STOCKS_RESULT', result); } });
},
//Subclass socketNotificationReceived received.
socketNotificationReceived: function(notification, payload) {
if (notification === ‘GET_STOCKS’) {
this.getStocks(payload);
}
}});
in stocks.js:
getDom: function() { var wrapper = document.createElement("table"); wrapper.className = 'normal regular small'; var count = 0; var _this = this; console.log("in the DOM function"); console.log("result is " + this); //prints [object Object] console.log("result is " + _this); //prints [object Object] console.log("result length is " + this.result.length); //prints 0 if (this.result.length > 0){ this.result.forEach(function(stock) { //since length=0, it never gets in this loop // // }, scheduleUpdate: function(delay) { console.log("scheduled update check"); var nextLoad = this.config.updateInterval; if (typeof delay !== "undefined" && delay >= 0) { nextLoad = delay; } var self = this; setInterval(function() { self.getStocks(); }, nextLoad); }, roundValue: function(value) { return Math.round(value*100)/100; }, getStocks: function () { var url = 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20csv%20where%20url%3D%27http%3A%2F%2Fdownload.finance.yahoo.com%2Fd%2Fquotes.csv%3Fs%3D' + this.config.stocks + '%26f%3Dsl1d1t1c1ohgv%26e%3D.csv%27%20and%20columns%3D%27symbol%2Cprice%2Cdate%2Ctime%2Cchange%2Ccol1%2Chigh%2Clow%2Ccol2%27&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys'; this.sendSocketNotification('GET_STOCKS', url); }, socketNotificationReceived: function(notification, payload) { if (notification === "STOCKS_RESULT") { console.log("notification received"); console.log(payload); //prints Object { query: Object } this.result = payload; this.updateDom(self.config.fadeSpeed); } },
-
RE: Stocks
@alexyak Thanks! I have one more question about syntax that I’m having trouble with.
I can pull the Yahoo JSON into the node_helper file and print it to the terminal without a problem. But when I try to reference it in the “getDom” function, I get nothing. I haven’t changed the code at the start of that function at all. But when it runs “this.result.length”, the length returned is 0.
I’m not super-familiar with the “this” syntax, but was hoping you or someone else might have an idea of why the JSON you pass would work, but not the JSON that I pass?
Thanks!
-
RE: Printing to output Terminal
@mochman Now I get it! Thanks so much for laying out the basics for me! First time dealing in server/client stuff and I’m starting to make sense of it in my head.
-
RE: Printing to output Terminal
@LukeCodewalker Thanks for helping me understand that. After poking around a bit, I found this topic: https://forum.magicmirror.builders/topic/86/how-to-troubleshoot
Am I correct in understanding that if I call a “console.log()” in a module.js, I should be able to see the output in the pm2 logs? Because right now I am having trouble with that.
I have no problem running the mirror with pm2, and I can pull the logs no problem. But all the logs show are just the typical startup stuff. None of the random text outputs I have tried to put in with “console.log()” command. Please help!
Thanks!
-
RE: How to Troubleshoot
If I am debugging code I am writing, is the easiest way to:
-save the module.js files
-run “pm2 restart mm”
-run “pm2 logs mm”Or is there a different command that will update the code and how the system in running on the fly without having to restart the mirror each time?
Thanks!
-
Printing to output Terminal
I’m currently trying to modify some modules and can’t figure out how to consistently output to the terminal for my own debugging process.
I use console.log(“xxxxx”) in a “node_helper.js” file and it seems to print just fine. But when I go to the actual “module.js” file, nothing i put in the console.log(“xxxx”) goes to the terminal. Help please!