初歩的な質問にて、大変失礼いたします。
Javascriptコードを作成・nodeJsで実行しているのですが、挙動に想定外がありますため、以下伺わせてください。
javascriptコード
javascript
1(connection変数定義、connectは問題なく済み) 2 3var tempNum = 0; 4function countTheNum(){ 5 connection.query('SELECT count(*) as column1 FROM testTable', (err,rows) => { 6 if(err) throw err; 7 8 tempNum = rows[0].column1; 9 console.log("!"+tempNum); 10 return tempNum; 11 }); 12 connection.end(); 13 return tempNum; 14} 15 16console.log("!!"+countTheNum());
console
console
1!!0 2!18935
①実行順序
関数(countTheNum)を定義したのち、末尾で呼び出しているため、コンソール出力は
!18935 !!0
になるものと理解しているのですが、こうならないのはなぜなのでしょうか・・・?
(初心者につき、今今学習中なところですが、、汗
「非同期・同期関数」をうまく使えばできる、の認識は正ですか?)
②変数スコープ
末尾の
console.log("!!"+countTheNum());
においては、0ではなく、18935が適用されていてほしいです。
javascriptの変数スコープ周りを調べて、tempNumを関数外で宣言すれば良いもの、と理解していますが、解決できていません。
どのような書き方をすれば良いのでしょうか?
何卒よろしくお願いいたします。
[追記]修正後コード(期待した結果は未得)
javascript
1function sampleResolve() { 2 return new Promise(resolve => { 3 setTimeout(() => { 4 resolve( 5 connection.query('SELECT count(*) as column1 FROM table', (err,rows) => { 6 if(err) throw err; 7 tempNum = rows[0].column1; 8 console.log("!"+tempNum); 9 return tempNum; 10 }) 11 ); 12 connection.end(); 13 }, 4000); 14 }) 15} 16 17async function sample() { 18 const result = await sampleResolve(); 19 return result; 20} 21 22sample().then(result => { 23 console.log("!!"+result); 24});
[追記]修正後コードのコンソール
!![object Object] !18935
完成系(※参考)
(確実に冗長すぎる書き方なので、修正は必要な認識。ただ、やりたいことは実現できたので、一応記載した次第。)
javascript
1var tempNum; 2function sampleResolve(testMethod) { 3 return new Promise(resolve => { 4 setTimeout(() => { 5 connection.query('SELECT count(*) as column1 FROM table', (err,rows) => { 6 if(err) throw err; 7 tempNum = rows[0].column1; 8 console.log("!"+tempNum); 9 resolve(testMethod(tempNum)); 10 }) 11 connection.end(); 12 }, 4000); 13 }) 14} 15 16function testMethod(tempNum){ 17 console.log("call back"); 18 return tempNum; 19} 20 21async function sample() { 22 const result = await sampleResolve(testMethod); 23 return result; 24} 25 26sample().then(result => { 27 console.log("!!"+result); 28});
完成系のコンソール出力(※参考)
!18935 call back !!18935
回答1件
あなたの回答
tips
プレビュー