zoukankan      html  css  js  c++  java
  • Nodejs与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开始独立完成企业级Java电商网站开发(服务端)
    ThreadLocal小试牛刀
    svn版本控制
    策略模式和工厂模式搭配使用
    MyBatis-Plus
    github骚操作
    【测试】 Java如何优雅的生成测试数据
    【随笔】开源之殇
    【Maven】maven 插件开发实战
  • 原文地址:https://www.cnblogs.com/vipyoumay/p/5598012.html
Copyright © 2011-2022 走看看