2016-09-30 11 views
1

私はExpressJS guideで次のが見つかりました:Expressはどのように非同期で動作しますか?

var mysql  = require('mysql'); 
var connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : 'dbuser', 
    password : 's3kreee7' 
}); 

connection.connect(); 

connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) { 
    if (err) throw err; 
    console.log('The solution is: ', rows[0].solution); 
}); 

connection.end(); 

が、これは悪い習慣ことになっていませんか?私がそれを見る方法では、クエリが実行される前に接続が終了する可能性があります。それは間違いを与えないだろうか?

答えて

1

としてはhereを次のように述べています

  • あなたが接続で起動するすべてのメソッドは、キューに入れられ、順番に実行されます。

  • 接続を閉じるには、mysqlサーバに終了パケットを送信する前に、残りのすべてのクエリが実行されていることを確認するend()を使用します。

クエリの実行が完了するまで、だから、クエリが完了する前にend()メソッドの呼び出しを行うことができるにもかかわらず、それが実際に実行されません。

これはNodeJS自体よりもmysqlパッケージで多くのことを行う必要があります。

+0

確かに、コールバックは起こらないでしょう - それは 'end'の後に起こります - だから私はこれが悪いコードだと思うでしょう – Soren

+0

コールバックが起こっていないかどうかは関係ありません'end()'を実行すると、前のクエリが実行されるのを妨げることはありません。 Wetherかどうかは、この悪質なコードはあなた次第であると考えていますが、質問で尋ねられたように "エラーを出す"ことはありません。 – Drown

+0

コールバックコードが新しいクエリを作成するとどうなりますか? – Soren

0

ご質問Expressでの非同期機能はどのように機能しますか?これは悪いことではありませんか?はいろいろな形で回答できますが、わかりやすくするために私はを説明したいと思います。

それは一般は、あなたが実際の実装を知らないを想定し、非常に悪い習慣です。

実装が本当にシンプルなのであれば、それはあなたが尋ねることを正確に実行します - つまり、endが実行されたときに接続を閉じたり終了したりすると、競合状況によっては動作しないかもしれない醜い競合状態機械の負荷。しかし

、参照カウントを行い賢い実装 - 「最後のコールバックが行われているときに近い」 - - endが実際に接続を閉じますが、単に言うためにフラグを設定しないで、それは可能作業。

リファレンスカウントを使用して実装されたmysqlコネクタの場合、これはうまくいく可能性がありますが、これはプラグインとして見つかったすべてのものにとって良い方法であるということと同じではありません。

関連する問題