[讨论]ES6 generator 跟 promise 还是很大的区别,你们怎么看

2014-09-24 10:34:47 +08:00
 coolicer
promise看得出是在形式上避免了回调,generator感觉比较灵活,可以改变运行的顺序。promise有用过,generator没有。

用过的人说说?
12545 次点击
所在节点    Node.js
13 条回复
willwen
2014-09-24 10:58:43 +08:00
作為國內來說還算少數的Harmony使用者,我可以說說自己的經驗。
1. Promise經歷了好幾個版本的製定,從很久之前就已經存在,它解決的是串行的異步嵌套問題
2. yield關鍵字把Generator Function切割為擁有多個出口的Generation

Promise是JavaScript社區的研發產物,而yield則是ECMA-262從別處參考而來的「類協程」實現。

yield可以做到非串行,而Promise很難。Promise兼容性強,yield只能繼續等。
各有千秋

關於Generation,請參考我的博客。http://lifemap.in/koa-co-and-coruntine/
otakustay
2014-09-24 11:17:46 +08:00
本来就不是为了实现一个东西提出的……generator本质上不是解决异步的方案,让你们用来玩异步了而已啊,ES7的async才是真正做异步的
coolicer
2014-09-24 11:33:52 +08:00
@willwen
@otakustay
受教了..
coolicer
2014-09-24 11:34:37 +08:00
@willwen 原来前几天看的文章是你写的,刚看过。
jsonline
2014-09-24 11:35:13 +08:00
Promise 哪里避免了回调?
只是一种回调的规则而已。
willwen
2014-09-24 11:35:37 +08:00
@otakustay 灰大大麼麼噠
coolicer
2014-09-24 11:39:03 +08:00
@jsonline 额,没说完整。避免了回调写法
otakustay
2014-09-24 11:55:46 +08:00
Promise最大的特点有以下几个:

1. 原本嵌套式的callback模型变成“看上去线性”的模型,以此提供代码逻辑的顺畅性
2. 异常传递,即当任何一个Promise失败时,异常会透过那些没有reject处理的节点一直到最后去,这是NodeJS的callback模型没有做到的。异常传递更接近正常代码中的try/catch,你可以有N行代码,任何一行代码都可能出错,但总能被后面的catch捕获,而NodeJS的callback模型要在每个callback中处理err参数,这是我一直反对NodeJS的异步模型的很重要的原因之一

而以上几点,其实通过Generator都能做,但这并不代表Generator和Promise是一类东西。Generator可以做更多的事,比如:

1. 生成一个无限列表,每次获取都递增1
2. 完成类似C#的Linq的工作,即多个对数组元素的操作(Iterator)只需要遍历一次数组,比如这样:asGenerator(array).each(o -> o.x++).where(o -> o.x > 10).map(o -> o.x),只有一次遍历
3. 产生一个每次获取一个元素都有重要、高消耗的资源访问的列表,完成延迟加载模型来将高消耗的元素获取延迟到真正访问时,而不需要一开始就获取N次形成静态的数组

Generator的用法非常非常多,上面说的也只是经典场景而已,绝对不要只把它当成一个coroutine的玩法,会被自己关在笼子里玩不开的
zhyu
2014-09-24 12:07:47 +08:00
这俩不是一个东西啊(
promise避免了回调的嵌套写法,代码可读性更好,异常处理也比较方便
generator…我会说我看到的时候就想到我写python的时候了么(我python写的多,node还在摸索中
otakustay
2014-09-24 13:15:51 +08:00
> 为什么node的主题是纯黑,能正常点吗?

因为这里是为了黑Node而存在的(误
SoloCompany
2014-09-24 13:28:52 +08:00
generator 是把一段看上去是同步执行的代码给「异步」起来,可以给你很好的控制代码运行的状态和行为,甚至可以具备达到让你用同步的方式来写异步代码的能力,但理解起来会有点困难。

而 promise 就是个专门为异步设计的东西,是把异步串接起来,和同步运行基本上是背道而驰的。

另外要注意一下,比如类似于 facebook 的那种注入 generator 框架是很不靠谱的,本质上是修改你的代码,把同步定义的函数变成一个 yield;问题在于它又不足够智能,经常会把一些不该异步化的函数也给改了,但是在运行过程中很难发现也很难调试,这些坑只要踩过一次你都会选择远离的。要用 generator 还是等 ECMA6 正式发布吧
skyitachi
2014-09-24 17:13:52 +08:00
generator 的特点在于lazy computation,结合es6的for...of会很方便很强大,当然这只是generator的基础用法。
promise 在于让异步代码看上去同步化,有着更好的可读性。
klam
2014-09-24 18:24:29 +08:00
深入理解Promise: http://segmentfault.com/blog/kk_470661/1190000000586666
Node.js回调黑洞全解:Async、Promise 和 Generator: http://zhuanlan.zhihu.com/FrontendMagazine/19750470

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/135335

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX