node与ES6系列3——generator对象

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值