【问题标题】:Meteor._wrapAsyncMeteor._wrapAsync
【发布时间】:2014-02-08 10:10:33
【问题描述】:

我用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

【问题讨论】:

    标签: javascript mysql node.js meteor


    【解决方案1】:

    Meteor._wrapAsync 是同步的,前提是您在所有任务完成后触发回调。只有当它知道方法已经完成时才会阻塞纤程,所以当你调用callback(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._wrapAsync 时,你也不需要Meteor.bindEnvironment,尤其是当你没有在任何地方的函数中使用任何 Meteor 代码时(你不在任何连接回调中使用流星代码,所以它不需要)。

    【讨论】:

      【解决方案2】:

      您可以结帐this video on Meteor._wrapAsync here in eventedmind。它在这个主题上做得很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-29
        • 1970-01-01
        • 1970-01-01
        • 2015-09-14
        • 2014-05-07
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        相关资源
        最近更新 更多