如何结束异步调用以同步运行?

时间:2011-07-27 09:41:28

标签: javascript mysql node.js

目前,这是我使用node-mysql

执行查询的方式
client.query( sql, function( error, result ) {
  console.dir( result );
});

我想同步这样做,就像这样

var result = client.querySync( sql );
console.dir( result );

我理解为什么在节点中阻塞是坏的,但我(几乎)长大到足以知道什么时候可以,什么时候没有。我只打算在初始化阶段,在任何事件循环之外进行同步调用。

有人知道我能做到这一点吗?

修改...

有些事情......

client.querySync = function( sql )
{
    var called = false;
    var result;

    while ( typeof result == 'undefined' ) {
        if ( ! called ) {
            called = true;
            this.query( sql, function( error, _result ) {
                result = { error: error, result: _result };
            });
        };
    }

    return result;
};

5 个答案:

答案 0 :(得分:5)

您提出的解决方案(在您的编辑中)将无效,因为您永远不会放弃该线程(因此永远不会调用回调,因此永远不会设置变量,因此您的循环永远不会中断)。节点不是多线程的 - 任何时候都只有一个线程执行javascript。除了从正在运行的代码返回之外,没有办法产生该线程。

所以,你不能做你想做的事。您可以尝试使用一些在同一场景中重新编写同步代码的解决方案,但我个人发现这种方法并不值得付出努力 - 只需咬紧牙关就行了一切都有回调(随着时间的推移痛苦消退:)。

答案 1 :(得分:2)

别。学习异步编程。

使用futuresJS之类的flowcontrol来保持代码的有序化

答案 2 :(得分:1)

我的猜测是,您可以在命令的“客户端”中添加排队系统,例如一系列命令,这些命令被添加到客户端的同步方法的每次调用中,然后在任何'的结尾处循环。阻止'行动。

这样:

client.mySyncMethod = function(command, callback)
{
    commandArray.push({command, callback});
    runCommands();
}

client.runCommands = function()
{
    for (var i in commandArray)
    {
        // run command
    }
}

答案 3 :(得分:0)

您遇到的问题是什么?

由于回调,您的样本本质上是程序性的。 如果在完成所有这些操作之前你不想要任何东西运行,那么只有在你的所有回调完成后才执行主代码:

client.query( sql, function( error, result ) {
  console.dir( result , function () {
      //now start your app code
  } );
});

除非程序启动完成,否则一切都仍然是异步的,你不是在与环境作斗争,而没有任何事情会发生。 用回调作为参数将整个事物包装在一个简单的函数中,你应该好好去。

至于同步执行此操作:Node.js显然不允许您暂停事件循环。那个概念不存在,你根本就不能。您可以将querySync编写为一系列回调,以使其同步运行..但它不会很漂亮。

答案 4 :(得分:-1)

node.js中没有办法使异步代码表现得像同步代码。