Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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 - Fatal编程技术网

Javascript 如何结束异步调用以实现同步行为?

Javascript 如何结束异步调用以实现同步行为?,javascript,mysql,node.js,Javascript,Mysql,Node.js,目前,这就是我使用节点mysql执行查询的方式 client.query( sql, function( error, result ) { console.dir( result ); }); 我想同步地做这个,像这样的事情 var result = client.querySync( sql ); console.dir( result ); 我理解为什么节点阻塞是不好的,但我(几乎)长大了,知道什么时候可以,什么时候不可以。我只打算在初始化阶段,在任何事件循环之外进行同步调用 有人

目前,这就是我使用节点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;
};

不要。学习异步编程


使用类似flowcontrol的方法来保持代码的有序性

我的猜测是,您可以在命令的“客户端”中添加排队系统,就像一个命令数组,该命令被添加到客户端的同步方法的每次调用以及任何“阻塞”操作结束时循环通过

因此:


你遇到了什么问题

由于回调,您的示例本质上是程序性的。 如果您不希望在所有这些工作完成之前运行任何东西,那么只在所有回调完成后执行主代码:

client.query( sql, function( error, result ) {
  console.dir( result , function () {
      //now start your app code
  } );
});
一切仍然是异步的,您不会与您的环境发生冲突,而除非程序启动完成,否则不会发生任何事情。。 将整个过程封装在一个简单的函数中,并将回调函数作为参数,这样就可以开始了


至于同步完成这一切:Node.js显然不允许您停止事件循环。这个概念不存在,你根本不能。您可以将querySync编写为回调链,以使其同步运行。。但它不会很漂亮

在node.js中没有办法让异步代码像同步代码一样工作。

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


所以,你不能做你想做的事。您可以尝试使用一些在后台将同步代码重新写入异步的解决方案,但我个人发现,这种方法并不真正值得付出努力——最好是咬紧牙关,通过回调完成所有事情(随着时间的推移,痛苦会消退:)

好的,谢谢,我来看看。你知道我将如何创建querySync吗。我相信我能够学习多个解决方案并做出自己的决定。@Tom错了,您需要查看API并了解它们是否公开
sync
调用。如果他们没有那么你的幸运汉克斯雷诺斯,我已经添加了我自己的解决方案。如果我们能暂时把是非放在一边,你会知道为什么它不起作用吗?可能的重复,可能的重复,好的,现在我们正在取得进展。或否。:)我使用的心智模型是由线程池1提供服务的作业队列。任何i/o完成都会创建新作业,其中作业是相应的回调。作业保留线程,直到它从其entry函数返回。我还发现,将应用程序视为状态机有助于保持清晰(而不是一系列高度嵌套的回调)。我同意。我总是得自己去弄清楚。从我的黑客攻击来看,节点似乎在推迟I/O调用。我尝试过在不同的地方放置infintae循环,我看到了这种模式。不过,我开始更清楚地看到,像fs.readFileSync()这样的软件正在搅乱我的思路。你似乎很确定。你有什么证据?要将异步调用转换为同步调用,你需要线程。调用者必须侦听/锁定属性,异步回调必须在异步回调中设置数据。但是在node.js中线程是不可能的,所以真的没有办法。
client.query( sql, function( error, result ) {
  console.dir( result , function () {
      //now start your app code
  } );
});