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的玩法,会被自己关在笼子里玩不开的