Home > Back-end >  Fetch variable from function into other function (under same function)
Fetch variable from function into other function (under same function)

Time:04-04

I am pretty new to Javascript, nodejs and socket io, so far everything has worked out, until I needed a new function which pulls data from multiply tables instead of just one table, when it's just one table it works fine, since I can emit from inside the function, but this new function, need to increase a number a few times and then emit it, but for some reason I can't get it to increase from the fetched data inside the query function.

This is my function

socket.on("db_rows", function() {
    setInterval(function() {
        
        var rows = 0;
        
        connection.query("SELECT COUNT(id) AS c FROM `systemusage`", function(error, result) {
            rows  = result[0].c;
        });
        
        connection.query("SELECT COUNT(id) AS c FROM `temperature`", function(error, result) {
            rows  = result[0].c;
        });
        
        connection.query("SELECT COUNT(id) AS c FROM `bmp280`", function(error, result) {
            rows  = result[0].c;
        });
        
        console.log(rows);
        
        //var rows = (dbs.a   dbs.b   dbs.c);
        
        var value = (rows).toLocaleString(
            undefined,
            { minimumFractionDigits: 0 }
        );
            
        io.emit("db_rows", value);
    }, 2000)
});

the rows variable doesn't get increased which means that rows is always 0 and I can't figure out a way to get the fetched data outside of the query function, can someone guide me in the right direction?

edit: I have been googling, but none of the answers has helped out.

CodePudding user response:

connection.query does not wait for a result so all three calls will be executed immediately and on the line console.log(rows); you won't have the correct accumulated value.
You either need to wrap all three calls into promises or use their async counterparts if any.

await new Promise((resolve, reject) => {
  connection.query("SELECT COUNT(id) AS c FROM `systemusage`", function(error, result) {
          if (error) {
             reject(error);   
          }
            rows  = result[0].c;
            resolve();
        });  
})

Also you will need to indicate that a callback for setInterval is now an async function:

setInterval(async function() {
...
})

CodePudding user response:

What about merging the queries in one SELECT? like

connection.query("
    SELECT * FROM (
        SELECT COUNT(id) AS c FROM `systemusage`
         
        SELECT COUNT(id) AS c FROM `temperature`
         
        SELECT COUNT(id) AS c FROM `bmp280`
    ) c
    ", function(error, result) {
            rows = result[0];
        });
  • Related