node + mysql 的回调的先后顺序问题?
发布于 5 年前 作者 jyk0011 3237 次浏览 来自 问答

刚学习数据库的操作,向mysql发出申请后,会接着执行后面的代码,同时等待数据库的回调。 那么如果发出多个请求,多个回调的执行顺序是啥样的呢?

比如这样的代码

var mysql = require(‘mysql’); var cnString = require(’…/sqlConnection.json’); var connection = mysql.createConnection(cnString); connection.connect(); var userAddSql = ‘INSERT INTO node_user(id,name,age) VALUES(0,?,?)’; var userAddSql_Params = ["张洒 ’ – " , 55]; //增 add connection.query(userAddSql,userAddSql_Params,function (err, result) { //回调1 }); connection.end();

connection = mysql.createConnection(cnString); connection.connect(); var userAddSql = ‘INSERT INTO node_user(id,name,age) VALUES(0,?,?)’; var userAddSql_Params = ["张洒 ’ – " , 55]; //增 add connection.query(userAddSql,userAddSql_Params,function (err, result) { //回调2 }); connection.end();

connection = mysql.createConnection(cnString); connection.connect(); var userAddSql = ‘INSERT INTO node_user(id,name,age) VALUES(0,?,?)’; var userAddSql_Params = ["张洒 ’ – " , 55]; //增 add connection.query(userAddSql,userAddSql_Params,function (err, result) { //回调3 }); connection.end();

connection = mysql.createConnection(cnString); connection.connect(); var userAddSql = ‘INSERT INTO node_user(id,name,age) VALUES(0,?,?)’; var userAddSql_Params = ["张洒 ’ – " , 55]; //增 add connection.query(userAddSql,userAddSql_Params,function (err, result) { //回调4 }); connection.end();

预想的是,会按照回调1、2、3、4的顺序被执行,因为node是单线程的,回调函数应该按照申请的顺序被回调。 但是实际运行几次后发现,每次四个回调的先后执行顺序完全不一样。 哪个回调先回来都有可能,这是啥原因呢?

怀疑问题出在mysql方面,但是不能确定。

所以想问问大家。

8 回复

执行mysql操作是异步的

@cnvp 知道是异步的呀,只是如果多个异步的话,每个异步是同时执行,还是一个一个的执行呢?

同步执行最好封装个最小异步单位来做,保证顺序一致,例子: https://github.com/zy445566/myBlog/blob/master/20180414block-run/index.js

@jyk0011 所谓异步,就是不能保证执行时间和返回顺序。 你这个场景,各个回调的顺序是不可预期的。要实现你的需求,得串行(比如 await)调用数据库。

@youmenglinzi 串行会影响其他用户的访问的等待时间。能不用还是尽量不用,否则估计系统很容易卡死。

异步操作是不能保证顺序的,想要流程控制用async函数,或者async await

@jyk0011 不会吧 底层还是异步哦 每个用户互不影响哦. 和你这样说 最新nodejs的async await 都没有多大用处了.包括koa egg这样的框架都是这样玩得

回到顶部