博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
es6+最佳入门实践(10)
阅读量:6406 次
发布时间:2019-06-23

本文共 2387 字,大约阅读时间需要 7 分钟。

10.Generator

10.1.Generator是什么?

Generator函数是ES6提供的一种异步编程解决方案。在它的内部封装了多个状态,因此,又可以理解为一种状态机,执行Generator函数后返回一个迭代器对象,使用这个迭代器对象可以遍历出Generator函数内部的状态

Generator函数和传统函数的不同点有:1 函数定义的时候,function关键字后面加“*”, 2 内部使用yield关键字定义内部状态

function* HelloGenerator() {    yield "状态1";    yield "状态2";    yield "状态3";    yield "状态4";}let hg = HelloGenerator();console.log(hg.next());  //{value: "状态1", done: false}console.log(hg.next());  //{value: "状态2", done: false}console.log(hg.next());  //{value: "状态3", done: false}console.log(hg.next());  //{value: "状态4", done: false}console.log(hg.next());  //{value: undefined, done: true}

Generator函数被调用后,并不会立即执行完成,而是会在遇到yield关键字后暂停,返回的也不是函数的运行结果,而是一个执行内部状态的指针对象(Iterator对象)

注意1: next方法内可以传参数,这个参数的值作为上一次状态的返回值

function* HelloGenerator() {    let result = yield "状态1";    console.log(result);    yield "状态2";    yield "状态3";    yield "状态4";}let hg = HelloGenerator();console.log(hg.next());console.log(hg.next('nodeing'));

注意2: 可以使用for...of来遍历Generator内部状态

function* HelloGenerator() {    yield "状态1";    yield "状态2";    yield "状态3";    yield "状态4";}let hg = HelloGenerator();for( let i of hg){    console.log(i);}

注意3: 对象没有Symbol.Iterator属性,我们可以手动添加,让其具有Iterator接口

let obj = {};function* gen() {    yield 1;    yield 2;    yield 3;    yield 4;}obj[Symbol.iterator] = gen;for(let a of obj){    console.log(a);}

10.2.Generator应用

1.限制抽奖次数

    
Title

2.异步读取文件

const fs = require('fs');function readFile(path) {    return new Promise((resolve, reject) => {        fs.readFile(path, (err, data) => {            if(err){                reject(err)            }else {                resolve(data)            }        })    })}function* asyncFile() {    yield readFile('a.txt');    yield readFile('b.txt');    yield readFile('c.txt');}let gen = asyncFile();gen.next().value.then((data)=>{    console.log(data.toString());    return gen.next().value;}).then((data2)=>{    console.log(data2.toString());    return gen.next().value;}).then((data3)=>{    console.log(data3.toString())});

如果觉得上面的写法还比较麻烦的话,我们可以引入一个co模块,让aysncFile里面的代码自动执行

const co = require('co');function* asyncFile() {    let a = yield readFile('a.txt');    let b = yield readFile('b.txt');    let c = yield readFile('c.txt');    console.log(a.toString(), b.toString(), c.toString())}co(asyncFile()).then(()=>{    console.log('文件读取完成')});

视频教程地址:

转载于:https://www.cnblogs.com/dadifeihong/p/10358130.html

你可能感兴趣的文章
用鸡讲解技术债务的形成过程?
查看>>
Linux下的Tftp服务
查看>>
C#将集合和Json格式互相转换的几种方式
查看>>
java连接数据库并操作
查看>>
安装.net framework 4.0时提示HRESULT 0xc8000222
查看>>
集群下文件同步问题
查看>>
ASA 5510 V821 EASY ×××配置
查看>>
ubuntu server 更换源
查看>>
SQL SERVER 2008安装
查看>>
EXT中的gridpanel自适应窗口的方法
查看>>
unary operator expected
查看>>
IPC之共享内存
查看>>
新加坡之旅
查看>>
IBM X3650 M3服务器上RAID配置实战
查看>>
Mysql DBA 高级运维学习之路-索引知识及创建索引的多种方法实战
查看>>
go语言与java nio通信,解析命令调用上下文拉起ffmpeg,并引入livego做的简单流媒体服务器...
查看>>
JavaScript面向对象轻松入门之多态(demo by ES5、ES6、TypeScript)
查看>>
【数据结构】线性表(一):顺序列表
查看>>
利用Mallet工具自动挖掘文本Topic
查看>>
Windows下oracle打补丁步骤
查看>>