Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 流星_Javascript_Mysql_Node.js_Meteor - Fatal编程技术网

Javascript 流星

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

我用Meteor包装了一个函数
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);
        });
    });
});