js 之generator(ES6提供的)

generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。

具体练习代码如下:

//generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。

//实现一个斐波那契数列 ,函数只能返回一个数组
var f1 = max => {
    var t, m = 0, n = 1, arr = [0, 1];
    while (arr.length < max) {
        t = m + n;
        m = n;
        n = t;
        arr.push(t);
    }
    return arr;
};

console.log(f1(10));

//使用generator 可以一次返回一个数,不断返回多次,generator 定义是 function*  f2(10) 并不是执行,只是创建了generator对象
// 执行需要使用next

var f2 = function* (max) {

    var t, m = 0, n = 1, k = 1;
    while (k < max) {
        yield m;
        t = m + n;
        m = n;
        n = t;
        k++;
    }
    return m;
};

var r = f2(10);

console.log(r.next());//{ value: 0, done: false }
//返回的value就是yield的返回值,done表示这个generator是否已经执行结束了。如果done为true,则value就是return的返回值。

for (var x of r) {
    console.log(x);
}
/**1
1
2
3
5
8
13
21 */
// 因为0已经在上面执行过了。

//generator 可以保存状态,还有一个用途就是异步回调代码变成“同步”代码

function a1(){
    console.log("第一个任务");
}

function a2(){
    console.log("第二个任务");
}

function a3(){
    console.log("第三个任务");
}

var ff1=function(x){
    console.log("任务结束");
}

ff1(a3(a2(a1())));
/**
 * 第一个任务
   第二个任务
   第三个任务
   任务结束
 */

//之前我们如果要顺序执行任务需要这样去一直回调,代码的可读性很差,


// 用generator是不是看起来很舒服
function* ff2(){
   yield a1();
   yield a2();
   yield a3();
}

var s=ff2();
for(var x of s){};

执行结果如下:

js 之generator(ES6提供的)_第1张图片
ceshi.gif

你可能感兴趣的:(js 之generator(ES6提供的))