与Node.js同步与asynchronous代码

我们正在与节点合作,主要是为了一个内部项目,并了解使用该技术的最佳方式。

不是来自特定的asynchronous背景,学习曲线可能是一个挑战,但我们正在习惯框架和学习过程。

使我们两极化的一件事是,当使用同步代码和asynchronous代码的最佳时机是。 我们现在正在使用的规则是,如果有任何事情与IO交互,那么它必须通过callback或事件发射器asynchronous(这是一个给定的),但其他项目不是以任何方式使用IO可以被构造为同步函数(这将取决于函数本身的沉重程度,以及如何实际阻止它),但这是使用Node.js时最好的方法吗?

例如,我们正在创build一个Hal + JSON构build器,它目前存在于我们的代码库中。 它是同步的,因为它所做的只是创build一些相当小的对象文字而已,没有外部的依赖关系,当然也没有IO的相互作用。

我们的方法是否合适?

假设您有两个函数, foobar ,它们是同步执行的:

 function foo() { var returnValue = bar(); console.log(returnValue); } function bar() { return "bar"; } 

为了使API“asynchronous”就是改变它使用callback:

 function foo() { bar(function(returnValue) { console.log(returnValue); }); } function bar(callback) { callback("bar"); } 

但事实是,这个代码仍然是完全同步的。 callback函数正在同一个调用堆栈上执行,并且没有进行线程优化,没有可伸缩性的好处。

然后它成为代码可读性和编码风格的问题。 我个人发现,典型的var val = func(); types代码更易读易懂。 唯一的缺点是,如果你有一天需要改变bar的function,那么需要执行一些I / O活动或者调用一些其他asynchronous的函数,你还需要改变bar的API 。

个人的偏好:适用时使用传统的,同步的模式。 在涉及I / O或有疑问时,始终使用asynchronous样式。

使用process.nextTick()将同步函数转换为asynchronous函数是一个选项,但只有在软件阻塞时间过长的情况下才能使用。 每当你的同步函数运行时,节点不能做任何事情,因为它是单线程的。 这意味着,如果你的应用程序是一个服务器,它变得没有响应。

在分解任何同步函数之前,我build议先做一些基准testing和分析,以便做出明智的决定。 否则,你会冒着过早优化的风险

在这里看到一个很好的讨论https://softwareengineering.stackexchange.com/questions/80084/is-premature-optimization-really-the-root-of-all-vil

下面是你如何使你的函数asynchronous,在这个意义上,你将允许节点做其他事情http://howtonode.org/understanding-process-next-tick

我不是什么“Hal + Json builder”,但是这是我对NodeJS的看法。 你应该写代码尽可能asynchronous,把它推到极限。 简单的原因是asynchronous代码为了响应而交易性能,这在大多数情况下更重要。

当然,如果某些操作非常快,那么就不需要asynchronous代码。 例如考虑这个代码:

 var arr = []; // assume array is nonempty for (var i = 0, l = arr.length; i < l; i++) { arr[ i ].doStuff( ); } 

如果arr小, doStuff是一个快速的操作,那么你不应该用asynchronous的方式编写这个代码。 但是,如果需要一些时间,那么你应该考虑这样写:

 var arr = []; // assume array is nonempty var process_array_element = function( ) { if (arr.length) { arr.pop().doStuff( ); process.nextTick( process_array_element ); } }; process_array_element( ); 

现在这个代码是真正asynchronous的。 它需要更多的时间才能完成工作,但同时它不会阻塞整个服务器。 我们已经交换了响应能力的performance。

结论:这取决于你的情况! 🙂