标签:javascript mysql node-js meteor
我用Meteor._wrapAsync包装了一个函数writeTransaction(),并在一个写入MySQL事务的for循环中调用了5次.
但是,从MySQL查询日志开始,似乎在上一个循环中的函数writeTransactionSync()完成之前执行循环的下一次迭代.
如果Meteor._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])
}
MySQL查询日志
329 Connect root@localhost on meteor
330 Connect root@localhost on meteor
331 Connect root@localhost on meteor
332 Connect root@localhost on meteor
333 Connect root@localhost on meteor
329 Query START TRANSACTION
330 Query START TRANSACTION
331 Query START TRANSACTION
332 Query START TRANSACTION
333 Query START TRANSACTION
329 Query DELETE FROM orders WHERE _id = '34zCYZXBxEkJapkYh'
330 Query DELETE FROM orders WHERE _id = 'SNR8zTEzGCw6X7RZ2'
331 Query DELETE FROM orders WHERE _id = 'TAF2TJkN5LzFRqAnX'
332 Query DELETE FROM orders WHERE _id = '57pJbvFYmHTpM5E6a'
333 Query DELETE FROM orders WHERE _id = 'BtNLGa3gjRGAfmMFf'
331 Query COMMIT
332 Query COMMIT
329 Query COMMIT
330 Query COMMIT
333 Query COMMIT
解决方法:
Meteor._wrapAsync是同步的,前提是您在完成所有任务后触发回调.如果它知道方法已经完成,它将只阻塞光纤,所以当你调用callback(null)时,它假定它已经完成.
在调用connection.query之后,您已经使用了回调(null),但无论您的查询是否已经完成,都会调用它,并且由于查询使用MySQL执行需要一些时间,因此它可能始终完成(在查询实际运行之前执行异步操作.
您应该将它放在查询的回调中:
connection.beginTransaction(function(err) {
connection.query('DELETE FROM orders WHERE _id = ?', [data._id], function(err) {
connection.commit(function(err) {
callback(null);
});
});
});
当你使用Meteor._wrapAsync时,你也不需要Meteor.bindEnvironment,特别是当你在任何地方没有使用任何Meteor代码时(你不在任何连接回调中使用流星代码,所以不需要它).
标签:javascript,mysql,node-js,meteor 来源: https://codeday.me/bug/20190831/1772911.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。