23 # generator 的使用

简介: 23 # generator 的使用

1、类数组:长的像数组

const likeArray = {
    0: "a",
    1: "b",
    2: "c",
    3: "d",
    length: 4
};

可以 Array.from 将类数组转为数组

Array.from(likeArray) // [ 'a', 'b', 'c', 'd' ]

也可以使用拓展运算符:原理就是遍历这个对象 将结果放到数组中,这个数组必须有个遍历器。

[...likeArray]

likeArray 是类数组并且没有遍历器不能迭代遍历,执行会报错:object is not iterable

下面实现 likeArray 的迭代器(数组里面是有 Symbol.iterator 的)

我们给 likeArray 添加这个迭代器

likeArray[Symbol.iterator] = function () {
    // 返回一个遍历器对象,需要有一个 next 方法,不停的调用
    let i = 0;
    return {
        // 这里用箭头函数让里面的this指向 likeArray
        next: () => {
            return {
                value: this[i],
                // done 为 true 表示完成
                done: i++ === this.length
            };
        }
    };
};
console.log([...likeArray]);

2、使用 generator 改造 likeArray 的迭代器

* 表示该函数是 generator 函数,generator 生成器生成的叫遍历器(迭代器)

likeArray[Symbol.iterator] = function* () {
    let i = 0;
    while (i !== this.length) {
        // yield 表示产出,固定语法,配合着 * 来使用
        yield this[i++];
    }
};
console.log([...likeArray]);

3、generator 的使用

普通函数默认会从头到尾执行没有暂停的功能,generator 函数是 es6 提供的语法,如果碰到 yield 就会暂停执行(redux-saga、koa1 中有用到)

function* read() {
    yield 1;
    yield 2;
    yield 3;
}
let it = read(); // it 就是迭代器,迭代器上面有个 next 方法
console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: 2, done: false }
console.log(it.next()); // { value: 3, done: false }
console.log(it.next()); // { value: undefined, done: true }
console.log(it.next()); // { value: undefined, done: true }

可以自己循环

let flag = false;
do {
    let { value, done } = it.next();
    flag = done;
    console.log("value--->", value);
} while (!flag);

4、yield 可以有返回值

function* read() {
    let a = yield 1;
    console.log("a---->", a);
    let b = yield 2;
    console.log("b---->", b);
    let c = yield 3;
    console.log("c---->", c);
    return c;
}
let it = read();
// next 是给上一次 yield 传参
it.next("k1"); // 第一次传参没有意义,上一次没有 yield
it.next("k2");
it.next("k3");
it.next("k4");

5、generator 的应用

比如:下面使用 generator 去读取两个文件的

const fs = require("fs").promises;
// 代码更像是同步的,但是执行还是异步的
function* read() {
    try {
        let name = yield fs.readFile("./file/name.txt", "utf-8");
        let age = yield fs.readFile("./file/age.txt", "utf-8");
        return { name, age };
    } catch (error) {
        console.log("error---->", error);
    }
}
let it = read();
let { value, done } = it.next();
value.then((data1) => {
    console.log("name---->", data1);
    let { value, done } = it.next(data1);
    value.then((data2) => {
        let { value, done } = it.next(data2);
        console.log("age---->", data2);
        console.log("return---->", value);
        // 还可以抛出异常
        // it.throw("泰裤辣");
    });
});

抛出异常:

目录
相关文章
|
10月前
|
人工智能 数据可视化 专有云
阿里云飞天企业版获评2024年AI云典型案例
近日,由全球数字经济大会组委会主办、中国信息通信研究院和中国通信企业协会承办的“云·AI·计算国际合作论坛”作为2024全球数字经济大会系列活动之一,在北京举办。论坛以“智启云端,算绘蓝图”为主题,围绕云·AI·计算产业发展、关键技术、最佳实践等展开交流讨论。阿里云飞天企业版异构算力调度平台获评2024年AI云典型案例。
450 3
|
安全 算法 网络安全
什么是 SSL 加密?
【8月更文挑战第31天】
1800 0
|
机器学习/深度学习 TensorFlow 算法框架/工具
Python 深度学习架构实用指南:第一、二部分(4)
Python 深度学习架构实用指南:第一、二部分(4)
92 1
|
机器学习/深度学习 算法
分类预测 | MATLAB实现MIV-SVM的平均影响值MIV算法结合支持向量机分类预测
分类预测 | MATLAB实现MIV-SVM的平均影响值MIV算法结合支持向量机分类预测
|
存储 算法
入门篇2:如何系统高效的学习算法与数据结构
入门篇2:如何系统高效的学习算法与数据结构
|
算法 C语言
全排列算法(C语言)
我看先看一下从1–4的全排列,如下
354 0
全排列算法(C语言)
《阿里云实时数仓Hologres最佳实践合集(网页)》电子版下载地址
《阿里云实时数仓Hologres最佳实践合集(网页)》PPT
177 0
《阿里云实时数仓Hologres最佳实践合集(网页)》电子版下载地址
|
SQL 弹性计算 分布式计算
《冬季实战营第五期:轻松入门学习大数据》实践报告
大数据环境的基本实现,使用PAI基于协同过滤算法实现商品推荐,通过使用阿里云Elasticsearch快速搭建智能运维系统
315 0
《冬季实战营第五期:轻松入门学习大数据》实践报告