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

tho*_*ter 4 javascript mysql node.js

目前,这是我使用node-mysql执行查询的方式

client.query( sql, function( error, result ) {
  console.dir( result );
});
Run Code Online (Sandbox Code Playgroud)

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

var result = client.querySync( sql );
console.dir( result );
Run Code Online (Sandbox Code Playgroud)

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

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

编辑...

有点......

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;
};
Run Code Online (Sandbox Code Playgroud)

Geo*_*ell 5

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

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