Javascript 如何结束异步调用以实现同步行为?
目前,这就是我使用节点mysql执行查询的方式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 ); 我理解为什么节点阻塞是不好的,但我(几乎)长大了,知道什么时候可以,什么时候不可以。我只打算在初始化阶段,在任何事件循环之外进行同步调用 有人
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
} );
});