等待一个asynchronous函数在Node.js中返回

假设,我在Node.js中有一个asynchronous函数,基本上是这样的:

var addAsync = function (first, second, callback) { setTimeout(function () { callback(null, first + second); }, 1 * 1000); }; 

现在我当然可以用asynchronous风格调用这个函数了:

 addAsync(23, 42, function (err, result) { console.log(result); // => 65 }); 

我想知道的是,是否可以使它以某种方式同步调用此function。 为此,我想有一个包装函数sync ,基本上做以下事情:

 var sync = function (fn, params) { var res, finished = false; fn.call(null, params[0], params[1], function (err, result) { res = result; finished = true; }); while (!finished) {} return res; }; 

然后,我可以通过这种方式同步运行addAsync

 var sum = sync(addAsync, [23, 42]); 

注意:当然你在现实中不会使用params[0]params[1] ,但是相应地使用arguments数组,但是我想在这个例子中保持简单。

现在,问题是,上面的代码不起作用。 它只是阻止,因为while循环块,并不释放事件循环。

我的问题是:是否有可能以任何方式使这个样本按预期运行?

我已经尝试了setImmediateprocess.nextTick和其他各种东西,但没有帮助。 基本上,你需要的是一种告诉Node.js请暂停当前函数,继续运行事件循环,并在以后的时间点回来的方法。

我知道你可以使用yield和generator函数来实现类似的function,至less在Node.js 0.11.2及更高版本中是这样。 但是,我很好奇它是否可以运作,甚至没有?

请注意,我完全知道如何在Node.js中执行asynchronous编程,事件循环和所有相关的东西。 我也完全意识到,编写这样的代码是一个坏主意,特别是在Node.js中。 而且我也充分意识到,“积极等待”也是一个愚蠢的想法。 所以请不要给出build议,学习如何asynchronous做或类似的东西。 我知道。

我问的原因只是出于好奇和学习的愿望。

  • 您可以使用npm光纤(C ++ AddOn项目)和节点同步
  • 在C(++)中实现一个阻塞调用,并将其作为库提供

是的,我知道 – 你知道 – 但永远 – 一直;)

非阻塞)使用控制stream库

我最近创build了更简单的抽象WaitFor ,以同步模式调用asynchronous函数(基于Fibers)。 这是在早期阶段,但工程。 请尝试: https : //github.com/luciotato/waitfor

使用WaitFor你的代码将是:

 console.log ( wait.for ( addAsync,23,42 ) ) ; 

你可以调用任何标准的nodejsasynchronous函数,就好像它是一个同步函数。

wait.for(fn,args …)满足与您的示例中的“同步”function相同的需求,但在光纤内部(没有阻塞节点的事件循环)