zoukankan      html  css  js  c++  java
  • Promise和Generator

    异同:
    1、promise解决的是串行的嵌套异步问题。
    2、yield把Generator Function切割为有多个出口的Generation。
    3、Promise是社区的研发产物,yield是ECMA-262从别处参数而来的类协程实现(就是ruanyf里面说的半协程)。
    4、yield可以做到非串行,而Promise很难,Promise兼容性强,yield是未来。
    5、generator的本质不是用来解决异步的。

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

    以上几点,其实通过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次形成静态的数组。

    总结promise最大的两点改变:
    1、将以前的回调模型改为更容易理解的线性模型
    2、将代码的控制权交回到我们的手中

    Generator:
    1、从字面理解,Generator函数是生产器,可以看作一个生产车间,而yield是这个车间的产品出/入口。
    2、我觉的yield是为了解决javascript单线程逻辑混乱而做的一种workflow层面的解决方案,让代码的工作流程更清晰,模拟工厂化的生产方式。
    3、线程是抢先式的,协程是合作式的。
    4、引入协程后,每个任务可以保持自己的调用栈,这样在抛出错误时就可以找到原始的调用栈,不至于像异步操作的回调函数那样,一旦出错,原始的调用栈已经结束了。
    5、Generator函数是ES6对协程的实现,但属于不完全实现。
    6、Generator函数被称为半协程,意思是只有Generator函数的调用者,才能将程序的执行权还给Generator函数,完全执行的协程,任何函数都可以让暂停的协程继续执行。
    如果将Generator函数当作协程,完全可以将多个需要相互协作的任务写成Generator函数,它们之间使用yield语句交换控制权。


    应用:
    异步操作的同步化表达
    控制流管理
    提供类似数组的数据结构
    部署Iterator接口,例如:

    function* iterEntries(obj) {
      let keys = Object.keys(obj);
      for (let i=0; i < keys.length; i++) {
        let key = keys[i];
        yield [key, obj[key]];
      }
    }
    let myObj = { foo: 3, bar: 7 };
    for (let [key, value] of iterEntries(myObj)) {
      console.log(key, value);
    }
    // foo 3
    // bar 7

    可以说Promise是基于语法层面的,Generator是基于语言层面的。

  • 相关阅读:
    Cisco产品采用的网络协议总结 java程序员
    实用级反主动防御rootkit设计思路 java程序员
    教你几招识别和防御Web网页木马 java程序员
    “TRUNK”的三个意思 不要混淆 java程序员
    Windows 图像捕获服务本地权限提升漏洞 java程序员
    入侵检测之蜜罐 java程序员
    小措施防范来自网络的ARP攻击 java程序员
    poj2299UltraQuickSort
    按位与或非
    hdu4325(线段树)
  • 原文地址:https://www.cnblogs.com/jyuf/p/7857398.html
Copyright © 2011-2022 走看看