gpt4 book ai didi

javascript - Meteor.wrapAsync

转载 作者:可可西里 更新时间:2023-11-01 07:58:55 26 4
gpt4 key购买 nike

我用 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 之后使用了 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 代码时(您不需要在您的任何连接回调中使用 meteor 代码,因此不需要)。

关于javascript - Meteor.wrapAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21644692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com