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 ...
随机推荐
- Docker 部署ELK之Sentinl日志报警
前篇文章简单介绍了Docker 部署ELK,以及使用filebeat收集java日志.这篇我们介绍下日志报警配置,这里我们使用Sentinl插件. 1.修改kibana参数 进入elk容器,修改对应参 ...
- excel中快捷计算单一列中的所有的值
excel中快捷计算单一列中的所有的值 比如B列中所有的值 =SUM(B1:B100) 计算B列第一行到第100行的值 又学了一招 如果想统计B列所有的值 可以用 =SUM(B:B)
- java报错 pom.xml第一行报"org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project...
https://www.cnblogs.com/appium/p/11168441.html 新建Maven项目时,每个pom文件第一行都报错. 一.问题分析 原因就是你的maven的配置文件不是最新 ...
- SpringBoot 通过jjwt快速实现token授权
A 10分钟了解JSON Web令牌(JWT)https://baijiahao.baidu.com/s?id=1608021814182894637&wfr=spider&for=p ...
- 2019 多点Dmalljava面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.多点Dmall等公司offer,岗位是Java后端开发,因为发展原因最终选择去了多点Dmall,入职一年时间了 ...
- Delphi中窗体的事件
Delphi中窗体的事件 Form窗体可以响应各种各样的时间,在Object Inspector的Events页面中罗列了一大堆,如下图: 下面将要列出一些常用的事件. 1.OnActivate 当窗 ...
- ASP.NET Core MVC上传文件
使用模型绑定上传小文件 HTML代码: <form method="post" enctype="multipart/form-data" asp-con ...
- ES6的强大变量声明
ES6是javascript的新特性,今天来说说声明变量 过去我们声明变量,都是一个一个声明,现在有了一种新的声明方式,它可以将一个多个变量同时声明,声明后变量同时存在一个集合中,集合的数据类型是对象 ...
- javascript DOM中的节点层次和节点类型概述
针对JS高级程序设计这本书,主要是理解概念,大部分要点源自书内.写这个主要是当个笔记加总结 存在的问题请大家多多指正! 因为DOM这方面的对象方法操作性都特别强,但是逻辑很简单,所以就没有涉及到实际的 ...
- Python渗透测试工具库
漏洞及渗透练习平台 WebGoat漏洞练习平台: https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台: https://github.com ...