ES6-Generator使用与改写
用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使用与改写的更多相关文章
- es6 generator函数的异步编程
es6 generator函数,我们都知道asycn和await是generator函数的语法糖,那么genertaor怎么样才能实现asycn和await的功能呢? 1.thunk函数 将函数 ...
- ES6 Generator vs ES6 async/await
ES6 Generator vs ES6 async/await next yield promise refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允 ...
- es6 generator函数
es6 新增了Generator函数,一种异步编程的解决方案 回顾一下,es6 提供了新的遍历方法,for of ,适用于各种数据集合,统一了遍历操作,原生支持for of 集合的数据集合有.数组,字 ...
- ES6 Generator的应用场景
一.基础知识 API文档 ES6 诞生以前,异步编程的方法,大概有下面四种. 回调函数 事件监听 发布/订阅 Promise 对象 Generator 函数将 JavaScript 异步编程带入了一个 ...
- ES6 Generator async
Generator 函数是 ES6 提供的一种异步编程解决方案 async 函数使得异步操作变得更加方便,是 Generator 函数的语法糖. js单线程的原因是:避免DOM渲染冲突! 更新:201 ...
- ES6 Generator 学习笔记一
Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同. Generator 函数有多种理解角度.从语法上,首先可以把它理解成,Generator 函数是一个状态机 ...
- ES6 generator 基础
参考文档 harmony:generators Generator是ES6的新特性,通过yield关键字,可以让函数的执行流挂起,那么便为改变执行流程提供了可能. 创建Generator functi ...
- ES6:Generator函数(1)
Generator函数是ES6提供的一种异步编程解决方案.它会返回一个遍历器对象 function* helloWorldGenerator(){ yield “hello”; yield “worl ...
- es6 --- Generator 函数
第一部分,ES6 中的 Generator 在 ES6 出现之前,基本都是各式各样类似Promise的解决方案来处理异步操作的代码逻辑,但是 ES6 的Generator却给异步操作又提供了新的思路, ...
- ES6 Generator使用
// generator介绍: function* hello() { console.log("hello world") } hello();//没有执行 // 直接调用hel ...
随机推荐
- Javascript Object常用方法总结
Object.keys方法 Object.keys方法是JavaScript中用于遍历对象属性的一个方法 .它传入的参数是一个对象,返回的是一个数组,数组中包含的是该对象所有的属性名. 如: var ...
- 喜大普奔,又拍云全新产品 WebSocket 上线啦
作为一款现象级 MMORPG,魔兽世界迎来了自己的 9.0 版本.巧的是,又拍云最近也更新发布了一款产品--WebSocket.你可能会说,两者有个 mao 关系,不着急.我们先来聊聊魔兽世界~ 熟悉 ...
- 【docker】centos7 上拉取docker镜像,一直拉取不到,报错:Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while w
镜像拉取一直报错: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request cancel ...
- TransactionScope 使用的注意事项
前两天为了给代码做一些事务封装,写了个小Demo,用TransactionScope代码块实现. 第一条更新成功后第二条刻意抛出异常,结果发现第一条总执行成功,这不符合预期,于是开始一步步跟踪调试. ...
- 小白开学Asp.Net Core 《八》
小白开学Asp.Net Core <八> — — .Net Core 数据保护组件 1.背景 我在搞(https://github.com/AjuPrince/Aju.Carefree)这 ...
- JVM:带你查看常见的问题,以及分析处方法
一.前言 各位开发和运维同学,在项目实施落地的过程中,尤其是使用EDAS.DRDS.MQ这些java中间件时,肯定会遇到不少JAVA程序运行和JVM的问题.我结合过去遇到的各种各样的问题和实际处理经验 ...
- G++命令
gcc and g++分别是gnu的c & c++编译器. 从源代码到可执行文件的四步 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件,用到预处理器cpp.这一步 ...
- [转]C++ 堆栈溢出的原因以及可行的解决方法
栈溢出(stackoverflow)的原因及解决办法 大家都知道,Windows程序的内存机制大概是这样的:全局变量(局部的静态变量本质也属于此范围)存储于堆内存,该段内存较大,一般不会溢出: 函数地 ...
- elasticsearch 安装 可视化工具
一.windows下安装Elasticsearch首先计算机需要JAVA环境(已有次此环境跳过)1.java环境安装网址:http://www.oracle.com/technetwork/java/ ...
- Asp.Net构架(Http请求处理流程)
一:引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net.他们耐心.细致地告诉你如何一步步拖放控件.设置控件属性.编写CodeBehind代码,以实现某个 ...