Koa / Co / Bluebird或Q / Generators / Promises / Thunk相互影响? (Node.js)
我正在研究与Koa部分构build一个Web应用程序,但是我并没有完全理解Hors,Whens,以及在哪些方面可以select – 应用 – 支持“使asynchronous更简单”的技术/方法下面列出)。
总的来说,networking上关于这个问题的不同指导仍然让事情变得模糊,特别是在不断发展的最佳实践方面,或者至less是更好的方面,以及在什么情况下。 networking上似乎没有什么东西可以把它全部放在上下文中。
我希望对这个庞大的屁股蔓延的post的反应可以纠正这一点 。 也许下面的问题可以激发人写一个彻底的博客文章或类似的东西来解决这个问题。 我的感觉是,我甚至不接近唯一会从中受益的人。
因此,如果明智的社群能帮助解答以下关于下列技术的问题(以粗体显示)并提供清晰的话,我会很高兴:
– a)他们如何以及在何种情况下(如适用)互相补充,补充,替代和/或重叠解决scheme?
– b)它们在速度性能,error handling简易性和debugging方便性方面有什么权衡?
– c)什么时候,何地以及为什么使用“这个”与“那个”技术,技术组合,和/或方法更好?
– d)哪些技术或方法(如果有的话)可能是“明星”。
(希望能够很好地解释作为答案一部分的意见。)
==============================
技术:
* Koa *
我的理解:
Koa是构buildNode应用程序的基础,它利用了ECMAScript-6特性,其中一个特性是生成器。
* Co *
我的理解:
– Co是一个运行ECMAScript-6生成器的实用程序库(它本来就是Node .011和谐的),其目标是允许编写样板代码来运行和pipe理生成器。
Co本质上是Koa(?)的一部分。
具体问题:
– 如果和如何在Koa中使用Co,而不是在非Koa中使用Co。 换句话说,Koa整个门面Co?
– 如果有更好的发电机库,Co可以replace成Koa发电机库吗? 有没有?
*承诺“Q”和蓝鸟等图书馆*
我的理解:
– 如果并且直到Node本身运行这个规范,它们在某种意义上就是用于实现Promises / A +规范的“polyfills”。
– 他们还有一些非规范的便利工具来促进使用许诺,比如Bluebird的promisfyAll工具。
具体问题:
– 我的理解是,ECMAScript-6规范很大程度上反映了Promises / A +规范,但即使如此,Node 0.11v和谐本身并不实现Promise。 (这是正确的吗?)但是,如果Q,蓝鸟等技术将会出路?
– 我读了一些大意是说“Q”和蓝鸟支持生成器。 这是什么意思? 例如,这是否意味着它在某种程度上提供了与Co相同的效用,如果是这样的话,到什么程度呢?
* Thunk和诺言*
我想我对自己的事情有一个公正的处理,但是希望有人能够对每个事物提供一个简洁而明确的“电梯投诉”定义,当然,正如上面所提到的那样,要解释何时使用“在科阿的情况下,而不是在它。
具体问题:
– 赞成和使用像蓝鸟的promisfy,比如说使用Thunkify(github的COM / visionmedia / node-thunkify)?
==============================
为了给这个post和它的问题提供一些进一步的背景,下面的网页中提供的Koa技术可以被讨论和对比(尤其是在专业人士vs反对者的基础上):
– a)www.marcusoft。 net / 2014/03 / koaintro.html(哪里是thunk或承诺,还是我没有看到什么?)
– b)强循环 com / strongblog / node-js-express-introduction-koa-js-zone(再一次,thunk或promises在哪里?)
c)github。 com / koajs / koa / blob / master / docs / guide.md(“next”参数等同于什么,以及它在什么地方设置?)
– d)blog.peterdecroos。 (不是在Koa上下文中,但是提供了使用Co和promise库(Bluebird),所以我假设这里提供的技术/模式借给了本身用在Koa(?)。如果是这样,那么怎么样?
谢谢大家!
我已经在发电机上工作了几个月,所以也许我可以试试这个。 我会尽量保持意见。 希望这有助于澄清一些混乱。
缺乏最佳实践和更好解释的部分原因是该function在JavaScript中还是如此新颖。 还有很less的地方可以使用生成器node.js和firefox是最突出的,虽然firefox偏离标准了一下。
我想指出的是,有像Traceur和再生器这样的工具,可以让你使用它们进行开发,并允许你把它们变成半等效的ES5,所以如果你觉得和他们合作愉快,那么没有理由不开始使用它们,除非你的目标是古老的浏览器。
发电机
生成器最初并不是被认为是处理asynchronous控制stream的一种方法,但是它们奇妙地工作。 生成器本质上是迭代器函数,通过使用yield可以使它们的执行暂停和恢复。
yield关键字本质上是说在这个迭代中返回这个值,当我再次调用next()时,我会从中断的地方继续。
Generator函数是一些特殊的函数,它们在第一次调用时不执行,而是返回一个带有几个方法的迭代器对象,并且可以用于for循环和数组parsing。
send(),:这将发送一个值到生成器,将其视为yield的最后一个值,并继续下一次迭代
next(),:这继续生成器的下一次迭代
throw():这将引发exceptionINTO生成器,导致生成器抛出exception,就像它来自最后的yield语句。
close():这将强制生成器返回执行,并调用生成器的任何最终代码,以便在需要时触发最终的error handling。
他们能够暂停和恢复的能力使他们在pipe理stream量控制方面如此强大。
有限公司
Co是围绕发电机的能力,使处理stream量控制更容易。 它不支持所有你可以用发生器做的事情,但是你可以通过使用更less的样板和头痛来使用它们中的大部分。 而为了stream量控制的目的,我还没有发现我需要的东西以外的东西已经提供。 虽然公平起见,我还没有尝试在stream量控制过程中向发生器发送值,但是这确实带来了一些有趣的可能性。
还有其他的一些发生器库,其中一些我可以想到的是,我的头顶部暂停,并运行。 我已经尝试过所有这些,并提供最大的灵活性。 如果你还不习惯发电机,暂停可能会稍微容易一些,但是我不能用权威来说。
就节点和最佳实践而言,我认为co正在赢得大量支持工具,而这些支持工具已经被创造出来了。 暂停最有可能的亚军。
Co与promise和thun一起工作,它们用于yield语句,以便知道何时继续执行generator,而不是手动调用next()。 Co还支持使用发电机,发电机function,对象和arrays进行进一步的stream量控制支持。
通过产生一个数组或一个对象,你可以在所有的产品上执行并行操作。 通过屈服于一个生成器或生成器函数,co将把进一步的调用委托给新的生成器,直到它完成,然后继续对当前生成器的下一个调用,允许用最less的样板代码有效地创build非常有趣的stream程控制机制。
承诺
虽然我说我会把意见保持在最低水平,但我想说,对我来说,承诺可能是最难的概念。 它们是维护代码的有力工具,但是如果用于高级stream程控制,它们很难掌握内部工作,并且可能会遇到很多问题。
我能想到的最简单的方法来解释承诺是它们是一个函数返回的对象,该函数保持函数的状态,并在进入对象的特定状态时调用callback列表。
承诺库本身不会很快到达任何地方。 他们添加了很多很好的承诺,其中包括完成(),没有把它变成ES6规范。 更不用说在浏览器和节点上可以使用相同的库,我们会在很长的一段时间内使用它们。
的thunk
Thunks只是一个函数,它只需要一个参数callback函数,并返回他们正在打包的另一个函数。
这就创build了一个闭包,它允许调用代码实例化在callback函数中传递的函数,以便在方法完成时告诉它。
Thunk是相当直接的理解和使用在我看来,但他们不是一切正确的工具。 例如,产卵是一个重大的创造thunk的痛苦,你可以做到这一点,但这并不容易。
Thunk与承诺
这些不是相互排斥的,可以很容易地一起使用,但通常select一个并坚持下去通常会更好。 或者至lessselect一个会议,这样你就可以很容易地知道哪个是哪个。 Thunks从我的经验中跑得更快,但是我没有对它进行基准testing。 大部分这可能是因为它是一个较小的抽象,并没有内置的error handling机制。
你通常会build立一些需要error handling的东西,尽pipe如此,整体的性能提升可能会轻易地取决于你的代码。
何时使用
生成器 – 当你可以安全地说你的应用程序能够运行在最前沿的时候,无论是浏览器还是Firefox浏览器> 0.11.3
我已经在我现在的公司中广泛地使用它们,并且不能乐意接受控制stream程机制和惰性评估。
承诺与Thunks – 这真的取决于你,你是多么舒适,每个与你合作。 他们不提供同样的好处,也不能解决同样的问题。 Promise直接帮助处理asynchronous问题,thunks只是确保一个函数为其他代码传入需要的callback参数。
你可以一起使用它们,只要你可以保留它,这是显而易见的,哪一个是你不会有问题的。
与发电机的承诺/ Thunks – 我build议你随时使用发电机控制stream量。 这不是必要的,但它更容易,就像使用co作为控制stream的抽象一样,发生器更容易。 键入的代码更less,维护更容易,而且可能性更低,因此您将遇到别人尚未遇到的边缘案例。
兴亚
我不打算详细介绍koa。 可以这么说,这与expression类似,但是是为了利用发电机而写的。 这确实给了它一些独特的优势,如更容易的error handling和级联中间件。 有办法完成所有这些任务,但他们不优雅,有时不是最高性能。
特别提示:发电机打开了我们还没有探索的可能性之门。 就像他们可以用于控制stream,当这不是他们最初的devise,我很积极,他们可以用来解决很多其他问题,我们通常有问题的JavaScript。 我可能会比我更聪明,发现我们还能如何使用它们,但我至less会开始和他们一起玩,并更好地了解他们的能力。 ES.next中的发电机还有更多的好处。