mysqljs / mysql

A pure node.js JavaScript Client implementing the MySQL protocol.
MIT License
18.22k stars 2.53k forks source link

breaks scope #2549

Closed davidbdyer closed 2 years ago

davidbdyer commented 2 years ago

i have an array variable declared outside of my function and my function pushes on to that array except only inside of the function outside of the function the variable is empty. Anyone know why?

connection.query(returnBranchNames, function(error, results) {
    if (error) throw error
    results.forEach(function(elm) {
        branchName.push(elm.branch_name);
    })
})
dougwilson commented 2 years ago

Hi @davidbdeath sorry you are having trouble. That is a general Node.js / JavaScript question, unrelated to this module. You can read more about this in the Node.js guide https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/

davidbdyer commented 2 years ago

Hi @dougwilson thanks for the quick response. I'm a little bit of a noob. I'm confused why it will output to console.log and push onto the variable locally inside the function but doesn't push onto it globally even though it's the same variable. I read the link but it's still a bit fuzzy. Do i need to create an async function? If you're too busy to explain I wont keep asking. My prof is good at mysql but not so much with javascript.

dougwilson commented 2 years ago

Hi @davidbdeath no problem. The issue is that with non-blocking operations that are common in Node.js (typically styled as a "callback"), the code does not run linear top-to-bottom -- the code inside the callback will run at a later time. So thus in the example like

console.log(1)
conn.query('SELECT 1', function () { // this is a callback
  console.log(2)
})
console.log(3)

The output will be 1, then 3, then 2. So if you declare a variable at 1, then manipulate it at 2, at 3, you won't see the value, since 3 ran before you did the manipulation, even though reading the file top-to-bottom looks like it may happen before.