用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. 第十九节:Asp.Net Core WebApi基础总结和请求方式

    一. 基础总结 1.Restful服务改造 Core下的WebApi默认也是Restful格式服务,即通过请求方式(Get,post,put,delete)来区分请求哪个方法,请求的URL中不需要写方 ...

  2. 【06】Kubernets:资源清单(控制器 - Deployment)

    写在前面的话 上一节主要简单的提了一下控制器都有哪些常用的,并且简单的功能是啥,最后一并提了 ReplicaSet 控制器. 但是 ReplicaSet 一般不需要我们直接配置,多以从本节开始,开始学 ...

  3. ECS上搭建Docker(CentOS7)

    ECS上搭建Docker(CentOS7) centos下 yum快速安装maven ## 安装jdk8 yum install -y java-1.8.0-openjdk* ## 安装maven w ...

  4. SVN服务端安装和仓库的创建

    1.安装SVN服务端 双击运行: 点击[next] 勾上复选框,点击[next] 使用默认选项,点击[next] 点击[Standard Edition]建议端口号不用443,因为Vmware占用了, ...

  5. Asp.net MVC企业级开发(01)---Autofac

    1.1 控制反转 在面向对象设计的软件系统中,它的底层都是由N个对象构成的,各个对象之间通过相互合作,最终实现系统的业务逻辑.同时,对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础.但是 ...

  6. Java内功心法,创建型设计模式包括哪些

    1. 单例(Singleton) Intent 确保一个类只有一个实例,并提供该实例的全局访问点. Class Diagram 使用一个私有构造函数.一个私有静态变量以及一个公有静态函数来实现. 私有 ...

  7. 深浅赋值+orm操作+Django-admin简单配置

    知识点 深浅copy 浅值深id orm操作 ManyToManyField 虚拟字段 告诉Django orm 自动帮你创建第三张表 查询的时候可以借助该字段跨表 外键属性可赋值外联对象 Model ...

  8. 如何设计提高服务API的安全性(二)API密钥方式详解

    在上文已经讲述了基础介绍,这篇文章详细讲解API密钥方式. 利用何种加密方式呢? 经过上面加密算法的理解,单向加密不仅性能高,而且有压缩性,即长度一致,有效减少网络传输过程中的字节大小.适合我们这种调 ...

  9. HTML Web Workers

    Web worker 是运行在后台的 JavaScript,不会影响页面的性能. 什么是 Web Worker? 当在 HTML 页面中执行脚本时,页面是不可响应的,直到脚本已完成. Web work ...

  10. 【转载】Gradle学习 第十章:网络应用快速入门

    转载地址:http://ask.android-studio.org/?/article/8 This chapter is a work in progress.这一章是一项正在进行中的工作. Th ...