异同:
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是基于语言层面的。

Promise和Generator的更多相关文章

  1. 前端面试送命题(二)-callback,promise,generator,async-await

    前言 本篇文章适合前端架构师,或者进阶的前端开发人员:我在面试vmware前端架构师的时候,被问到关于callback,promise,generator,async-await的问题. 首先我们回顾 ...

  2. JS异步编程 (2) - Promise、Generator、async/await

    JS异步编程 (2) - Promise.Generator.async/await 上篇文章我们讲了下JS异步编程的相关知识,比如什么是异步,为什么要使用异步编程以及在浏览器中JS如何实现异步的.最 ...

  3. 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制

    [原创]分布式之数据库和缓存双写一致性方案解析(三)   正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...

  4. 原生JS中 callback,promise,generator,async-await 的简介

    callback,promise,generator,async-await 的简介 javascript异步的发展历程. ES6 以前: 回调函数(callback):nodejs express ...

  5. ES6中的Promise和Generator详解

    目录 简介 Promise 什么是Promise Promise的特点 Promise的优点 Promise的缺点 Promise的用法 Promise的执行顺序 Promise.prototype. ...

  6. ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await

    ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await co ...

  7. 前端笔记之ES678&Webpack&Babel(下)AMD|CMD规范&模块&webpack&Promise对象&Generator函数

    一.AMD和CMD规范(了解) 1.1传统的前端开发多个js文件的关系 yuan.js中定义了一个函数 function mianji(r){ return 3.14 * r * r } main.j ...

  8. 使用promise 和 generator来管理工作流

    根据p219的代码改编 示例代码如下 function oneStep(value){ return new Promise(function(resolve, reject){ resolve('o ...

  9. 取代Promise的Generator生成器函数

    接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还有一种常用的解决方案,它就是Ge ...

随机推荐

  1. 6. kafka序列化和反序列化

    https://blog.csdn.net/weixin_33690963/article/details/91698279 kafka序列化: 生产者在将消息传入kafka之前需要将其序列化成byt ...

  2. webpack 配置react脚手架(六):api

    1 访问网址 https://cnodejs.org/api 可以调取api 2.//该body-parser 可以将请求的body数据,转变成 json 格式数据://express-session ...

  3. dt7.0百度熊掌当天主动推送方法

    因自己没事新做了一个网站,申请了一个熊掌号,所以做了这个主动推送接口,希望能收录快些,在此分享下关于DT7.0主动当天推送功能 上代码: <?php /* 百度当天主动推送熊掌功能 作者:68喜 ...

  4. 前端学习笔记--CSS3

    本本记录了css3的样式:浏览器支持度.圆角边框.阴影.文字与文本.过渡.动画.2d旋转.3d旋转 浏览器支持度: 1.圆角边框 例:只要确定了x.y值,就能知道弧度 画一个圆形:长=宽,border ...

  5. ajax跨域请求webservice webconfig配置

    <configuration> <system.web> <compilation debug="true" targetFramework=&quo ...

  6. Java出现 The server time zone value '�й���׼ʱ��' is unrecognized 异常

    解决办法: 在配置连接数据库的URL后面加上?serverTimezone=UTC ,如下: jdbc:mysql://localhost:3306/test?serverTimezone=UTC

  7. Jquery tabs

    官网 http://api.jqueryui.com/tabs/ 必须通过了后台验证tab1的信息后才允许进入tab2 var passed=false;          $("#tabs ...

  8. 模拟I2C协议学习点滴之程序相关定义

    由于主机和从机都会给数据线SDA发信号,比如主机先给SDA发送数据后,从机收到数据后发送应答信号将SDA拉低,故SDA类型设定为inout.而DATA设定为inout类型,是起到校验通信的作用(后续的 ...

  9. Gym - 101981E 思维

    Gym - 101981EEva and Euro coins 题意:给你两个长度皆为n的01串s和t,能做的操作是把连续k个相同的字符反转过来,问s串能不能变成t串. 一开始把相同的漏看了,便以为是 ...

  10. CSPS2019游(tuifei)记

    %%%脸哥没脸%%% Day0,日常考前紧张,做不下题去.听各大主任送祝福(从里红(wa)到外) 然后就出发了,大巴上和云力一起坐,吃了好多东西.中午因不满火车站的不合理收费,选择了面包+火腿 下午在 ...