node与ES6系列3——generator对象
来源:互联网 发布:手机淘宝货到付款骗局 编辑:程序博客网 时间:2024/06/06 18:57
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。
0 0
- node与ES6系列3——generator对象
- node与ES6系列2——promise对象
- node与ES6系列1——变量声明
- node与ES6系列4——class
- ES6——Generator
- ES6学习—Generator函数
- ES6学习笔记(七)--Generator函数与Promise对象
- ES6 —(Generator 函数的语法)
- ES6 —(Generator 函数应用)
- 【ES6学习】— (2)异步编程Generator函数和Promise对象简介
- ES6-Generator与异步操作
- ES6 — 对象扩展
- Node.js es6 generator 和 thunk 函数解决异步金字塔
- ES6个人学习整理(七)——Generator
- ES6 —(Generator 函数的异步应用)
- ES6--Generator
- ES6-generator
- 【es6】Generator
- 无名线段树2
- java泛型
- HDU 2076 夹角有多大(题目已修改,注意读题)
- android apk 防止反编译技术第二篇-运行时修改Dalvik指令
- 最近5年133个Java面试问题列表
- node与ES6系列3——generator对象
- android混淆去掉日志
- 从编译到制作固件
- Codeforces 616E Sum Of Reminders
- iOS应用生命周期相关内容
- node与ES6系列4——class
- jdk配置正确但是tomcat服务器启动时一闪而过
- 从Java回调机制分析Android动态加载布局过程中出现的IllgalStateException
- socat的安装与使用