用Generator封装Symbol中的iterator方法:

注意:Generator的function后必须写*

config:分别有3个txt文件,两个文件写路径,一个文件写要输出的内容

前置写法,node引入fs:

let fs = require('fs');

function read(path){
return new Promise((res, rej) => {
fs.readFile(path, 'utf-8', (err,data) => {
if(data){
res(data);
}else{
rej(err);
}
})
})
}

  

当前的迭代方法:
let obj = {
: 'a',
: 'b',
: 'c',
length:,
[Symbol.iterator]: function (){
let index = ;
let next = () => {
return {
value: this[index],
done: this.length == ++index
}
} return {
next
}
}
} console.log([...obj]);//(3) ["a", "b", "c"] for(let p of obj){
console.log(p);//a b c
} 改写后的方法:
let obj = {
: 'a',
: 'b',
: 'c',
length:,
[Symbol.iterator]: function* (){
let index = ;
while(index != this.length){
yield this[index++]
}
}
} console.log([...obj]);//(2) ["a", "b"] for(let p of obj){
console.log(p);//a b
}

用promise解决回调地狱问题与Generator方法对比

let fs = require('fs');

function read(path){
return new Promise((res, rej) => {
fs.readFile(path, 'utf-8', (err,data) => {
if(data){
res(data);
}else{
rej(err);
}
})
})
} read('./number.txt').then((value) => { return read(value);
}).then((value) => {
return read(value);
}).then((value) => {
console.log(value);
}) 以上缺点调用太多次then方法

那么我们用Generator方法解决一下回调地狱

function * readA() {

    let val1 = yield read('./number.txt');
let val2 = yield read(val1);
let val3 = yield read(val2); return val3;
}
//返回Generator对象
let oG = readA(); let {value, done} = oG.next(); value.then((val) => {
let {value, done} = oG.next(val);
value.then((val) => {
let {value, done} = oG.next(val);
value.then((val) => {
console.log(val)
})
})
}) 缺点:与回调地狱无区别

Generator优化:

注意:必须引入fs模块才能运行

function * readA() {

    let val1 = yield read('./number.txt');
let val2 = yield read(val1);
let val3 = yield read(val2); return val3;
} function Co(oIt){
return new Promise((res, rej) => {
let next = (data) => {
let {value, done} = oIt.next(data);
if(done != true){
value.then((val) => {
next(val);
})
}else{
res(value);
} }
next();
})
} Co(readA()).then((val) => {
console.log(val)
})

node有co模块,在npm下载使用,效果一样

ES6-Generator使用与改写的更多相关文章

  1. es6 generator函数的异步编程

    es6 generator函数,我们都知道asycn和await是generator函数的语法糖,那么genertaor怎么样才能实现asycn和await的功能呢? 1.thunk函数    将函数 ...

  2. ES6 Generator vs ES6 async/await

    ES6 Generator vs ES6 async/await next yield promise refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允 ...

  3. es6 generator函数

    es6 新增了Generator函数,一种异步编程的解决方案 回顾一下,es6 提供了新的遍历方法,for of ,适用于各种数据集合,统一了遍历操作,原生支持for of 集合的数据集合有.数组,字 ...

  4. ES6 Generator的应用场景

    一.基础知识 API文档 ES6 诞生以前,异步编程的方法,大概有下面四种. 回调函数 事件监听 发布/订阅 Promise 对象 Generator 函数将 JavaScript 异步编程带入了一个 ...

  5. ES6 Generator async

    Generator 函数是 ES6 提供的一种异步编程解决方案 async 函数使得异步操作变得更加方便,是 Generator 函数的语法糖. js单线程的原因是:避免DOM渲染冲突! 更新:201 ...

  6. ES6 Generator 学习笔记一

    Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同. Generator 函数有多种理解角度.从语法上,首先可以把它理解成,Generator 函数是一个状态机 ...

  7. ES6 generator 基础

    参考文档 harmony:generators Generator是ES6的新特性,通过yield关键字,可以让函数的执行流挂起,那么便为改变执行流程提供了可能. 创建Generator functi ...

  8. ES6:Generator函数(1)

    Generator函数是ES6提供的一种异步编程解决方案.它会返回一个遍历器对象 function* helloWorldGenerator(){ yield “hello”; yield “worl ...

  9. es6 --- Generator 函数

    第一部分,ES6 中的 Generator 在 ES6 出现之前,基本都是各式各样类似Promise的解决方案来处理异步操作的代码逻辑,但是 ES6 的Generator却给异步操作又提供了新的思路, ...

  10. ES6 Generator使用

    // generator介绍: function* hello() { console.log("hello world") } hello();//没有执行 // 直接调用hel ...

随机推荐

  1. Docker修改已创建容器端口映射

    修改已创建容器端口映射. 通过编辑 hostconfig.json 文件来修改 Docker 容器的端口映射 该文件地址:/var/lib/docker/containers/[hash_of_the ...

  2. windows远程桌面无法拷贝文件的问题与解决方法

    在开发完往windows服务器上部署系统或者给系统打补丁的时候,都会需要远程桌面的双向拷贝文件功能. 但是有些时候却会发现没有办法拷贝文件,原因主要有两个. 01 远程桌面的剪贴板设置 一个是在远程桌 ...

  3. Centos7/Ubuntu 初始化硬盘分区、挂载

    刚刚在腾讯云买了一台服务器,刚买的服务器的数据盘都是需要自己来分区的,下面就记录一下操作. 通过命令fdisk-l查看硬盘信息 可以看到有两块硬盘/dev/vda和/dev/vdb,启动vda是系统盘 ...

  4. 使用CodeFirst创建数据库

    1.新建一个类库项目 2.右键管理Nuget程序包,搜索EntityFramework.然后安装 3.新建一个类,然后引用 using System.Data.Entity; 然后写类初始化方法(ba ...

  5. linux centos无法删除网站根目录下的.user.ini解决办法

    .user.ini文件在执行rm -rf时,提示无法删除 解决办法 首先了解下chattr命令的作用:不让用户修改.删除文件等. -i选项:设定文件不能被删除.改名.设定链接关系,同时不能写入或新增内 ...

  6. Spring扩展点之BeanFactoryPostProcessor

    前言 BeanFactoryPostProcessor接口是Spring中一个非常重要的接口,它的接口定义如下 public interface BeanFactoryPostProcessor { ...

  7. 编译OpenCV提示opencv_contrib缺少boostdesc_bgm.i等文件

    错误提示: ~/opencv_contrib/modules/xfeatures2d/src/boostdesc.:: fatal error: boostdesc_bgm.i: No such fi ...

  8. Direct Access to Video Encoding and Decoding

    来源:http://asciiwwdc.com/2014/sessions/513   Direct Access to Video Encoding and Decoding  Session 5 ...

  9. sqlldr导入数据取消回显记录条数

    之前在脚本中使用sqlldr导入数据时,如果表的数据量较大的话,会使日志文件变得极大,之后在网上查找了很久,才在一个偶然的机会找到这个参数 silent=all 但是最近发现这样写有个问题,就是加了这 ...

  10. Java数据类型(1)

    基本数据类型 A.整型 byte:(8位--1个字节 有符号 以二进制补码表示) 范围:-27~27-1 即 -128~127 short:(16位--2个字节 有符号 以二进制补码表示) 范围:-2 ...