如何包装一个asynchronous调用来同步行为?

目前,这是我如何使用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; }; 

你提出的解决scheme(在你的编辑中)不会工作,因为你永远不会放弃线程(所以callback永远不会被调用,所以variables永远不会被设置,所以你的循环永远不会中断)。 节点不是multithreading的 – 任何时候只有一个线程执行javascript。 除了从任何正在运行的代码返回外,没有办法产生该线程。

所以,你不能做你想做的事情。 您可以尝试使用一些解决scheme,将您的同步代码重新编写为幕后asynchronous代码,但是我个人发现这种方法并不值得这么做 – 只是咬一口就行了一切与callback(随着时间的推移疼痛消退:)。

别。 学习做asynchronous编程。

使用像futuresJS这样的stream量控制来保持你的代码的组织

我的猜测是,你可以在命令的“客户端”中添加排队系统,就像添加到客户端的命令数组一样,然后在每次调用客户端的同步方法的同时循环遍历,也可以通过任何“阻塞”动作结束。

所以:

 client.mySyncMethod = function(command, callback) { commandArray.push({command, callback}); runCommands(); } client.runCommands = function() { for (var i in commandArray) { // run command } } 

你遇到了什么问题?

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

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

一切仍然是asynchronous的,你不是在和你的环境作斗争,除非程序启动已经完成,否则什么都不会发生。把整个事情用一个简单的函数包装起来,把callback作为一个参数,你应该很好。

至于这样做全部同步:Node.js显然不允许你停止事件循环。 那个概念不存在,你根本就不能。 你可以写你的querySync作为一个callback链,使其performance同步..但它不会很漂亮。

node.js没有办法让asynchronous代码像同步代码一样行事。