设为首页 收藏本站
查看: 839|回复: 0

[经验分享] Nodejs与ES6系列3:generator对象

[复制链接]

尚未签到

发表于 2017-2-24 10:30:01 | 显示全部楼层 |阅读模式
3、generator对象
  Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同。Generator的中文翻译是生成器,它是ECMAScript6(代号harmory)中提供的新特性。在过去,封装一段运算逻辑的单元是函数。函数只存在“没有被调用”或者“被调用”的情况,不存在一个函数被执行之后还能暂停的情况,而Generator的出现让这种情况成为可能。

3.1、generator对象定义
  Generator的定义十分简单,与普通的函数相比,它只多出一个*号。以下为简单例子:
function *dowork(a) {  var sum = yield a + 2;
  sum = yield a + 4;
  sum = yield a + 5;
  
}
  
var gen = dowork(10);
  
console.log(gen.next());
  

  
======
  
{ value: 12, done: false }
  在dowork函数中通过yield关键字让程序暂停在当前位置,通过generator.next()单步执行,next返回一个对象包括value和done,value为当前程序的计算结果,而done则表示程序是否执行完成。

3.2、generator与异步操作
  上一级讲了promise对象与异步操作,其实在ES6中也可以用generator来处理异步操作。
function *doWork() {  var url = 'http://www.163.com';
  var url1 = 'http://www.sina.com';
  var result = yield fetch(url);
  var result1 = yield fetch(url1);
  console.log(result1);
  
}
  

  
var generator = doWork();
  
var ret = generator.next();
  
ret.value.then(function (data) {
  var ret1 = generator.next(data);
  ret1.value.then(function (data) {
  generator.next(data);
  })
  
});
  fetch函数是一个异步执行函数,返回promise对象,整个doWork函数由两个异步函数构成最后打印其中一个异步函数的结果,由于每个next返回的是promise对象因此需要在then中处理数据。

3.3、优化流程
  generator实现异步可以让代码变得更线性,但是调用过程还是比较麻烦的,因此可以模仿tj大神的co框架(https://github.com/tj/co) 的原理开发一个简易控制流函数,暂且名字也取为co。
function co(generator) {  var gen = generator.next();
  var next = function (gen) {
  if (!gen.done) {
  if (gen.value instanceof Promise) {
  gen.value.then(function (data) {
  next(generator.next(data));
  })
  }
  else {
  next(generator.next(data));
  }
  }
  }
  next(gen);
  
}
  
// 执行
  
co(doWork());
  通过co包装的异步方法可以非常简单的执行,编程体验接近与java。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346525-1-1.html 上篇帖子: Nodejs从有门道无门菜鸟起飞教程。 下篇帖子: NodeJS测试实例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表