Koa / Co / Bluebird或Q / Generators / Promises / Thunks相互影响? (Node.js的)

时间:2014-04-16 04:14:18

标签: node.js generator promise bluebird koa

我正在调查与Koa合作建立一个网络应用程序,但我不能完全了解如何选择 - 并应用 - 支持的范围&# 34;使异步更容易"技术/方法(见下文)。

总体而言,关于此主题的网络上的不同指南仍然会使事情变得模糊,特别是在不断发展的最佳实践方面,或者至少是更好的方法,以及在什么情况下。网络上似乎很少或根本没有任何内容将其全部置于上下文中。

我希望对这个大屁股庞大的帖子的回复可以纠正。也许下面的问题可以激发某人写一篇完整的博客文章等来解决这个问题。我的感觉是,我甚至没有接近唯一能从中受益的人。

如果明亮的社区能够帮助回答并明确以下列出的技术(粗体字),我会感到高兴:

  

- a)如何以及在何种情况下(如适用)他们互相补充,补充,替代和/或重叠解决方案?

     

- b)在速度性能,错误处理简易性和调试简易性方面,他们有什么权衡取舍?

     

- c)何时,何地以及为何更好地使用"这个"与#34;那"技术,技术 - 组合和/或方法?

     

- d)哪些技术或方法(如果有的话)可能是"调暗星星"。

(希望可以很好地解释作为答案一部分的意见。)

==============================

技术:

* Koa *

我的理解:

  

Koa是构建Node应用程序的最小基础,旨在利用ECMAScript-6功能,其中一项功能尤其是生成器。

* Co *

我的理解:

  

- Co是一个用于运行ECMAScript-6生成器(它们是Node .011和谐的原生)的实用程序库,其目标是为了运行和管理编写样板代码的一些/多(?)需求。发电机。

     

- Co本质上是Koa(?)的一部分。

具体问题:

  

- 如果以及如何在Koa中使用Co与在非Koa上下文中使用不同。换句话说,Koa是完全立面Co?

     

- 如果有更好的产品库,可以用Koa替换其他类似的生成器库吗?有没有?

*承诺诸如" Q"等图书馆。和蓝鸟*

我的理解:

  

- 它们在某种意义上是" polyfills"用于实现Promises / A +规范,如果Node直到运行该规范    - 他们还有一些非规范便利设施,以促进使用承诺,例如Bluebird的promisfyAll实用程序。

具体问题:

  

- 我的理解是ECMAScript-6规范确实/将在很大程度上反映Promises / A +规范,但即便如此,Node 0.11v和声本身并不实现Promises。 (这是正确的吗?)但是,如果确实如此,Q和Bluebird等技术是否会出局?

     

- 我已经读过一些有关" Q"和Bluebird支持发电机。这是什么意思?例如,它在某种程度上是否意味着它们在某种程度上提供了与Co相同的效用,如果是这样,那么在何种程度上呢?

* Thunks and Promises *

  

我认为我能够公平地处理它们的内容,但希望有人可以提供一个简洁明了的电梯间距"定义每个是什么,当然,如上所述,解释何时使用一个与另一个 - 在Koa上下文而不是在其中。

具体问题:

  使用Thunkify(github com / visionmedia / node-thunkify)与使用像Bluebird这样的东西相比,是赞成还是缺点?

==============================

为了给这篇文章及其问题提供一些进一步的背景,如果可以对以下网页中提供的Koa技术进行讨论和对比(特别是在优点与缺点的基础上),可能会很有趣:< / p>

  

- a)www.marcusoft。 net / 2014/03 / koaintro.html(在哪里是thunk或promises,或者我没有看到什么?)

     

- b)strongloop。 com / strongblog / node-js-express-introduction-koa-js-zone(同样,那里是thunk还是承诺?)

     

- c)github。 com / koajs / koa / blob / master / docs / guide.md(&#34; next&#34;参数等于什么,设置它和在哪里?)

     

- d)blog.peterdecroos。 com / blog / 2014/01/22 / javascript-generators-first-impressions(不是在Koa上下文中,但是介绍了Co与promise库(Bluebird)的使用,所以我假设提供了技术/模式这适合在Koa(?)中使用。如果是这样,那么效果如何?

全部谢谢!

1 个答案:

答案 0 :(得分:54)

我现在已经和发电机一起工作了一个月,所以也许我可以尝试一下。我会尽量将意见保持在最低限度。希望它有助于澄清一些混乱。

缺乏最佳实践和更好解释的部分原因是该功能在javascript中仍然是如此新颖。仍然很少有地方可以使用生成器node.js和firefox是最突出的,虽然firefox偏离了标准。

我想要注意的是,有一些像traceur和regenerator这样的工具可以让你将它们用于开发,并允许你将它们变成半等效的ES5,所以如果你觉得使用它们很愉快,那么就没有了不要开始使用它们的原因,除非您针对的是古老的浏览器。

发电机

生成器最初并不被认为是处理异步控制流的一种方法,但它们可以很好地工作。生成器本质上是迭代器函数,允许通过使用yield来暂停和恢复它们的执行。

yield关键字基本上表示为此迭代返回此值,并且当我再次调用next()时,我将从中断处继续。

生成器函数是特殊函数,因为它们不会在第一次调用时执行,而是返回一个迭代器对象,其上有几个方法,并且可以用于for-of循环和阵列理解。

send(),:这会将一个值发送到生成器,将其视为yield的最后一个值并继续下一次迭代

next(),:这将继续发生器的下一次迭代

throw():这会在生成器中引发异常INTO,导致生成器抛出异常,就像它来自上一个yield语句一样。

close():这会强制生成器返回执行并调用生成器的任何最终代码,以便在需要时触发最终错误处理。

他们暂停和恢复的能力使他们在管理流量控制方面如此强大。

Co围绕发电机的能力建立,使处理流量控制更容易。它不支持您可以使用生成器完成的所有操作,但是您可以通过它使用大部分内容来减少样板和头痛。出于流量控制的目的,我还没有发现我需要的东西已经超出了co提供的范围。虽然公平地说我没有尝试在流量控制期间向发电机发送值,但这确实带来了一些有趣的可能性....

还有其他一些生成器库,其中一些我可以想到的最重要的是暂停和gen-run。我已经尝试过所有这些并且co提供了最大的灵活性。如果您还不习惯发电机,暂停可能会更容易一些,但我无法用权威来表达。

就节点和最佳实践而言,我说co目前正在通过创建的大量支持工具获胜。暂停最有可能的亚军。

Co同时使用promises和thunk,它们用于yield语句,以便co知道何时继续执行生成器,而不是手动调用next()。 Co还支持使用发电机,发电机功能,对象和阵列来进一步控制流量。

通过生成数组或对象,您可以对所有生成的项执行并行操作。通过屈服于生成器或生成器函数,co将委托对新生成器的进一步调用,直到它完成,然后在当前生成器上继续调用next,允许您使用最少的样板代码有效地创建非常有趣的流控制机制。

承诺

虽然我说我会将意见保持在最低限度但我想说明,对我而言,承诺可能是最难掌握的概念。它们是维护代码的强大工具,但它们很难掌握内部工作原理,如果用于高级流控制,可能会遇到很多问题。

我能想到解释promises的最简单的方法是它们是一个函数返回的对象,它保持函数的状态和一个回调列表,当对象的特定状态是或已经被调用时进入。

承诺图书馆本身很快就会去任何地方。他们为承诺包括done()提供了很多好处,而这些承诺并没有进入ES6规范。更不用说可以在浏览器和节点中使用相同的库这一事实我们将长期使用它们。

的thunk

Thunks只是一个函数,它接受一个参数回调并返回它们正在包装的另一个函数。

这会创建一个闭包,允许调用代码实例化在其回调中传递的函数,以便在方法完成时告知它。

在我看来,Thunks很容易理解和使用,但它们并不是适合所有事情的正确工具。例如,spawn是一个很大的痛苦,你可以做到,但它不容易。

Thunks vs. Promises

这些并不是互相排斥的,可以很容易地一起使用,但通常选择一个并坚持使用它会更好。或者至少选择一个约定,这样你就可以很容易地分辨出哪个。从我的经验来看,Thunk的运行速度更快,但我还没有对它进行基准测试。大多数情况可能是因为它是一个较小的抽象,并没有内置的错误处理机制。

您通常会构建一些需要处理错误的内容,因此根据您的代码,thunk的整体性能提升可能会轻易地支持或支持承诺。

何时使用

生成器 - 当你可以安全地说你的应用程序能够在最前沿运行时,它是否仅适用于浏览器或节点的firefox&gt; 0.11.3

我已经在我现在所在的公司广泛使用它们,并且对控制流机制和它们允许的惰性评估感到高兴。

Promises vs. Thunks - 这取决于你,以及你与每个人合作的舒适程度。他们没有提供相同的好处,也没有解决同样的问题。 Promises直接帮助处理异步问题,thunks只是确保函数获取其他代码传递所需的回调参数。

你可以将它们放在一起使用,只要你可以保留它,这样就很明显哪个是你不会遇到问题。

使用生成器的Promises / Thunks - 我建议您在使用生成器进行控制流时随时执行此操作。它不是必需的,但它更容易,就像使用co作为生成器控制流的抽象更容易。更少的代码输入,更容易维护,以及更少的可能性,您将遇到其他人尚未遇到的边缘情况。

兴亚

我不打算详细介绍koa。我只想说它类似于表达但写作利用发电机。这确实给它带来了一些独特的优势,例如更容易的错误处理和级联中间件。之前有很多方法可以完成所有这些任务,但它们并不优雅,有时也不是最高效的。

特别提示: 发电机打开了我们尚未探索过的可能性的大门。就像它们可用于控制流程一样,当他们的初始设计不是我的正面时,它们可以用来解决我们通常在javascript中遇到的许多其他问题。找到我们如何使用它们可能会比我更聪明,但我至少开始玩它们并更好地理解它们的能力。 ES.next中的发电机还有更多好处。