generator函数应用

梦想的初衷 提交于 2020-04-06 19:34:39

generator 应用

  1. 创建状态机,实现状态之间的切换
// // 状态机
// function* toggle() {
//     while (true) {
//         yield false;
//         yield true;
//     }
// }
// // 状态机
// let t = toggle();
// // 点击按钮,切换状态
// btn.onclick = () => {
//     console.log(t.next())
// }
// 轮播图;状态:索引值
// function* swiper(num) {
//     while (true) {
//         // 根据图片数量,切换状态
//         for (let i = 0; i < num; i++) {
//             yield i;
//         }
//     }
// }
// // 创建轮播图状态机
// let s = swiper(5);
// console.log(s.next())
// console.log(s.next())
// console.log(s.next())
// console.log(s.next())
// console.log(s.next())
// console.log(s.next())
// console.log(s.next())
// console.log(s.next())
// console.log(s.next())
  1. 控制流管理
// 回调函数
// tast1(value1 => {
//     tast2(() => {
//         tast3()
//     })
// })
// 任务管理
// function* tast(value) {
//     try {
//         // 做任务
//         value = yield tast1(value)
//         value = yield tast1(value)
//         value = yield tast1(value)
//     } catch (e) {
//     } finally {
//         return value
//     }
// }
  1. 部署 Iterator 接口
// 对象
// let obj = {
//     num: 10, 
//     color: 'red'
// }
// obj[Symbol.iterator] = function* () {
//     // 获取属性
//     let keys = Object.keys(this);
//     // 遍历属性
//     for (let key of keys) {
//         yield [key, this[key]]
//     }
// }
// console.log([...obj])
// 类数组对象
let arrLike = {
    0: 100,
    1: 200,
    2: 300,
    3: 400,
    length: 4
}
arrLike[Symbol.iterator] = function* () {
    // 索引值
    let index = 0;
    while (index < this.length) {
        yield this[index++]
    }
}
console.log([...arrLike])
  1. 定义数据结构
// 引入fs
let fs = require('fs');
let names = ['./1.txt', './2.txt', './3.txt'];
// for循环遍历并读取
// 定义generator函数,封装操作
function* files(arr) {
    // 遍历文件名称
    for (let item of arr) {
        // 读取文件,
        yield fs.readFile.bind(null, item, 'utf-8');
    }
}
// 可以读取文件的遍历器对象
let f = files(names);
// 读取文件
// f.next().value((err, content) => console.log(content));
for (let file of f) {
    file((err, data) => console.log(data))
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!