Javascript 流星
我用Meteor包装了一个函数Javascript 流星,javascript,mysql,node.js,meteor,Javascript,Mysql,Node.js,Meteor,我用Meteor包装了一个函数writeTransaction()。\u wrapAsync并在for循环中调用了5次,该循环编写了一个MySQL事务 但是,从MySQL查询日志来看,似乎在上一个循环中的函数writeTransactionSync()完成之前就执行了循环的下一次迭代 如果Meteor.\u wrapAsync没有使函数阻塞,我们如何使函数同步 服务器端代码 writeTransaction = function(data, callback) { var mysql
writeTransaction()
。\u wrapAsync并在for
循环中调用了5次,该循环编写了一个MySQL事务
但是,从MySQL查询日志来看,似乎在上一个循环中的函数writeTransactionSync()
完成之前就执行了循环的下一次迭代
如果Meteor.\u wrapAsync没有使函数阻塞,我们如何使函数同步
服务器端代码
writeTransaction = function(data, callback) {
var mysql = Meteor.require('mysql')
var connection = mysql.createConnection(info).connect()
connection.beginTransaction(Meteor.bindEnvironment(function(err) {
connection.query('DELETE FROM orders WHERE _id = ?', [data._id], Meteor.bindEnvironment( function(err) {
connection.commit( Meteor.bindEnvironment( function(err) {
}))
}))
}))
callback(null)
}
writeTransactionSync = Meteor._wrapAsync(writeTransaction)
for(var i=0; i<5; i++) {
writeTransactionSync(data[i])
}
Meteor.\u wrapAsync
是同步的,前提是在所有任务完成后启动回调。它只会在知道该方法已完成时阻塞光纤,因此当您调用回调(null)
时,它会假定该方法已完成
在调用connection.query之后,您已经使用了callback(null)
,但是无论您的查询是否完成,它都会被调用,而且由于使用MySQL执行查询需要一点时间,因此在查询实际运行之前,它很可能总是完成的(并且是异步的)
应将其放置在查询的回调中:
connection.beginTransaction(function(err) {
connection.query('DELETE FROM orders WHERE _id = ?', [data._id], function(err) {
connection.commit(function(err) {
callback(null);
});
});
});
另外,当您使用Meteor.\u wrapAsync
时,您不需要使用Meteor.bindEnvironment,尤其是当您在任何地方的函数中都没有使用任何Meteor代码时(您在任何连接回调中都没有使用Meteor代码,因此它不是必需的)。您可以签出。它在这个话题上做得很好
connection.beginTransaction(function(err) {
connection.query('DELETE FROM orders WHERE _id = ?', [data._id], function(err) {
connection.commit(function(err) {
callback(null);
});
});
});