ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – Meteor._wrapAsync

2019-08-31 04:14:04  阅读:153  来源: 互联网

标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有