Generator函数

摘要:
1.概念:可以从多个角度理解Generator功能。从语法上,我们首先可以理解为Generator函数是一个封装多个内部状态的状态机。执行Generator函数将返回遍历器对象,即Generator函数不仅是一个状态机,还是一个遍历器对象生成函数。换句话说,Generator函数是分段执行的,yield语句是暂停执行的标记,下一个方法可以继续执行。4.摘要:调用Generator函数并返回一个遍历器对象,表示Generator函数的内部指针//对象方法//Generator函数是ES6中协程序的实现。最大的特点是它可以移交函数的执行权。

1,概念:

Generator函数有多种理解角度。从语法上,首先可以把它理解成,Generator函数一个状态机,封装了多个内部状态

执行Generator函数会返回一个遍历器对象,也就是说,Generator函数除了状态机,还是一个遍历器对象生成函数。

2,特征:

一是,function关键字与函数名之间有一个星号;

二是,函数体内部使用yield语句,定义不同的内部状态。(yield语句在英语里的意思就是“产出”)。

3,理解:

Generator函数的调用方法和普通函数一样,但不同的是,调用Generator函数后,该函数并不知晓,返回是也不是函数运行结果,而是一个指向内部状态的指针对象,也就是遍历器对象。 
必须调用遍历器对象的next方法,似的指针移动到下一个状态。也就是说,每次调用next方法,内部指针就从函数头部或上一次定下来的地方开始执行,直到遇到下一个yield语句(或return语句)为止。换言之,Generator函数是分段执行的,yield语句是暂停执行的标记,而next方法可以恢复执行。

4,总结:

调用Generator函数,返回一个遍历器对象,代表Generator函数的内部指针。以后每次调用遍历器对象的next方法,就会返回一个有着valuedone两个属性的对象。 
value属性表示当前的内部状态的值,是yield语句后面那个表达式的值;done属性是一个布尔值,表示是否遍历结束。

// 对象方法
//Generator 函数是协程在 ES6 的实现,最大特点就是可以交出函数的执行权(即暂停执行)。
const obj = {
    * n() {
        yield 'hello'
    }
}
console.log(obj.n().next());//{value: "hello", done: false}

// 函数
//整个 Generator 函数就是一个封装的异步任务,或者说是异步任务的容器。
//异步操作需要暂停的地方,都用 yield 语句注明。
function* stateFn(){
    yield '状态一';
    yield '状态二';
    return '状态三';
}
var state = stateFn();
console.log(state);//stateFn {<suspended>}
console.log(state.next());//{value: "状态一", done: false}
console.log(state.next());//{value: "状态二", done: false}
console.log(state.next());//{value: "状态三", done: true}
console.log(state.next());//{value: undefined, done: true}

//next 方法还可以接受参数,这是向 Generator 函数体内输入数据。
function* gen(x){
    var y = yield x +2;
    return y;
}
var g = gen(1);
console.log(g.next());//{value: 3, done: false}
//console.log(g.next());//{value: undefined, done: true}
//next 方法还可以接受参数
console.log(g.next(9));//{value: 9, done: true}

//Generator 函数内部还可以部署错误处理代码,捕获函数体外抛出的错误。
function* hen (x){
    try {
        var y = yield x + 4;
    }catch(e){
        console.log(e);//出错了
    }
}
var h = hen(1);
console.log(h.next());//{value: 5, done: false}
//这意味着,出错的代码与处理错误的代码,
//实现了时间和空间上的分离,这对于异步编程无疑是很重要的。
h.throw("出错了");
console.log(h.next());//{value: undefined, done: true}

免责声明:文章转载自《Generator函数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ubuntu 常用 apt更新命令QEMU1.3.0的源码分析三:user model之linux下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C++11的for循环,以及范围Range类的实现

C++11支持range-based for循环。这是一个很方便的特性,能省挺多代码。以下代码就能很方便的遍历vector中的元素,并打印出来: 1 2 3 4 5 6 7 8 std::vector<int> int_vec; int_vec.push_back(1); int_vec.push_back(2); //如果要修改i...

moment的使用

1. 下载安装npm install moment -s 2. 引入 import moment from "moment" 3. 使用 console.log( moment().format("LLLL")) // Friday, March 26, 2021 11...

scheme中表只能操作头部带来的一个问题

很多简单的算法,为了能够转成尾递归,不得不采取比较繁琐的计算过程,或者使用多遍的遍历过程。在scheme中,比如map的实现,按照定义的实现 (define (map p l)   (if (null? l)        '()       (cons (p (car l)) (map p (cdr l))))) 是一个普通的递归,无法转成迭代进行计算。...

编译安装squid3.1亲测

编译安装Squid2.6 1,设置“文件描述符”,并设置用户同时打开文件数量 # vi /usr/include/bits/typesizes.h # vi /usr/include/linux/posix_types.h 把里边的 #define __FD_SETSIZE 1024 改成 65536 2,设置当前环境 # ulimit -Hs 65536...

MongoDB查询(游标操作、游标信息)

转自:http://blog.csdn.net/congcong68/article/details/46933609 一、简介 db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段。并返回到匹配文档的游标,可以随意修改查询限制、跳跃、和排序顺序的功能。 二、db.collectio...

python- generator生成器

什么是生成器? 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的l...