generator
应用
- 创建状态机,实现状态之间的切换
// // 状态机
// 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())
- 控制流管理
// 回调函数
// 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
// }
// }
- 部署
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])
- 定义数据结构
// 引入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))
}
来源:oschina
链接:https://my.oschina.net/u/4162046/blog/3220740