asynchronous在Express中如何工作?

我在ExpressJS指南中find了以下内容:

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(); 

这不应该是不好的做法吗? 我看到它的方式,可以执行查询之前连接结束。 这不会给错误吗?

如此处所述:

  • 您在连接上调用的每个方法都按顺序排队并执行。

  • closures连接是使用end()来完成的,它确保所有剩余的查询在发送一个退出的数据包到mysql服务器之前被执行。

所以,尽pipe在查询完成之前,可以调用end()方法,但在查询执行完成之前,并不会执行。

这必须比NodeJS本身更多地使用mysql包。

你的问题asynchronous在Express中如何工作?这不应该是不好的做法? 可以用很多方式回答,但为了清晰起见,我想解释一下, 这取决于!

假设你不知道实际的执行情况,这通常是非常糟糕的做法。

如果这个实现真的很简单,那么它在什么地方完成你要求的操作 – 即在执行结束时closures或者结束连接,这可能会导致相当难看的竞争条件,根据机器的负载情况它可能会或者可能不会工作。

然而,引用计数的一个聪明的实现 – 这是end并不实际上closures连接,但只是设置一个标志来说 – “ 当最后一次callback完成,然后closures ” – 然后它可以工作。

如果它使用引用计数实现的mysql连接器,那么这可能会正常工作 – 但这不是说,这是一个很好的做法,你作为一个插件find的一切。