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

  1.thunk函数    将函数替换成一个只接受回调函数作为参数的单参数函数

/* Thunk 函数替换的不是表达式,而是多参数函数,将其替换成一个只接受回调函数作为参数的单参数函数。 */
/*
注 fn 传入的是一个函数,传入一个函数形成的方法,传入参数,最后传入callback
在经过两次函数调用后,该函数就换成一个只接受回调函数作为参数的单参数函数
*/
var thunk = function(fn) {
return function() {
let args = Array.prototype.slice.call(arguments);
return function (callback) {
args.push(callback);
return fn.apply(this,args)
}
}
}

  2.generator异步编程的示例

/* 异步执行方法 */
function timeout(ms,val) {
return new Promise((res)=>{
setTimeout(()=>{
res(val)
},ms)
})
}
function *fn(){
yield timeout(2000,1)
console.log('222')
yield timeout(3000,2)
yield timeout(2000,3)
return 2;
}

  使用while去让上面的generator函数自执行

/* res.value本身是个异步的promise方法,如果几个promise 有关联那么这样就不行了 */
var f = fn();
var res = f.next();
while(!res.done) {
res.value.then((val)=>{
console.log(val)
})
res = f.next();
}

  在浏览器可知打印的结果,并不是顺序的,1 3 是同以事件输出的,2是最后输出的

  我们也可以使用promise嵌套使其按顺序输出,但是这种并不好,因为可能不知道具体有几个yield,嵌套的方式写的不好看

var f = fn();
var res = f.next();
res.value.then((val)=>{
console.log(val)
return res = f.next().value
}).then((val)=>{
console.log(val)
return res = f.next().value
}).then((val)=>{
console.log(val)
return res = f.next().value
})

  我们定义一个generator自执行器(注为什么要提thunk函数,timeout已经经过thunk类似的封装了)

/* 写一个适合generator的执行器 */
function *gn(){
let p1 = yield timeout(2000,1)
console.log(p1)
let p2 = yield timeout(3000,2)
console.log(p2)
let p3 = yield timeout(2000,3)
console.log(p3)
return 2;
}
// 按顺序输出 1 2 3
/* 传入要执行的gen */
/* 其实循环遍历所有的yeild (函数的递归)
根绝next返回值中的done判断是否执行到最后一个,
如果是最后一个则跳出去*/
function run(fn) {
var gen = fn();
function next(data) {
/* 执行gen.next 初始data为undefined */
var result = gen.next(data)
/* 如果result.done 为true 则代表执行到了gen的return,直接跳出去 */
if(result.done) {
return;
}
/* result.value 为promise */
result.value.then(val=>{
next(val)
})
}
/* 调用上一个next方法 */
next();
}
run(gn)

上述输出结构,分别是 1 2 3 ,间隔时间 2s 3s 2s

  虽然已经有async和await这样的generator的语法糖了,但是我们还是需了解以下他们的本质。相信您了解了本质,掌握asycn和await更不在话下

  文章参考地址,阮一峰老师的  Generator 函数的异步应用 http://es6.ruanyifeng.com/#docs/generator-async

es6 generator函数的异步编程的更多相关文章

  1. ES6的新特性(17)——Generator 函数的异步应用

    Generator 函数的异步应用 异步编程对 JavaScript 语言太重要.Javascript 语言的执行环境是“单线程”的,如果没有异步编程,根本没法用,非卡死不可.本章主要介绍 Gener ...

  2. ES6学习笔记(十五)Generator函数的异步应用

    1.传统方法 ES6 诞生以前,异步编程的方法,大概有下面四种. 回调函数 事件监听 发布/订阅 Promise 对象 Generator 函数将 JavaScript 异步编程带入了一个全新的阶段. ...

  3. js-ES6学习笔记-Generator函数的异步应用

    1.ES6 诞生以前,异步编程的方法,大概有下面四种. 回调函数 事件监听 发布/订阅 Promise 对象 Generator 函数将 JavaScript 异步编程带入了一个全新的阶段. 2.所谓 ...

  4. 16.Generator 函数的异步应用

    Generator 函数的异步应用 Generator 函数的异步应用 异步编程对 JavaScript 语言太重要.Javascript 语言的执行环境是"单线程"的,如果没有异 ...

  5. 17.Generator函数的异步应用

    异步编程对 JavaScript 语言太重要.Javascript 语言的执行环境是“单线程”的,如果没有异步编程,根本没法用,非卡死不可. 1.传统方法 ES6 诞生以前,异步编程的方法,大概有下面 ...

  6. Generator 函数的异步应用

    异步编程对 JavaScript 语言太重要.Javascript 语言的执行环境是“单线程”的,如果没有异步编程,根本没法用,非卡死不可.本章主要介绍 Generator 函数如何完成异步操作. 传 ...

  7. es6 generator函数

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

  8. ES6:Generator函数(1)

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

  9. es6 --- Generator 函数

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

随机推荐

  1. 苹果手机上input的button按钮颜色显示问题

    在苹果手机上的input按钮自带效果,需要加上outline:0px; -webkit-appearance:none; 清除原有样式,同时苹果手机上的input按钮自带圆角需要按需要去掉 input ...

  2. Linux root用户密码重置,远程登陆,文件基本属性

    Linux root用户密码重置,远程登陆,文件基本属性 忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下root密码 ...

  3. java开发需掌握技能2

    1.了解Dubbo+Zookeeper面向服务SOA架构.SpringCloud+Eureka微服务架构.ActiveMQ消息通讯模式.RocketMQ分布式消息.Zookeeper集群.Redis缓 ...

  4. vue-router(转)——基本使用 + 路由守卫无限循环问题

    路由守卫无限循环问题 https://www.jianshu.com/p/1187f8f74a72 学习目的 学习Vue的必备技能,必须 熟练使用 Vue-router,能够在实际项目中运用. Vue ...

  5. 测试常用shell语句——数值,数组类型;函数创建

    一.特殊类型的变量 shell下默认的变量类型为字符串类型 1,数值类型 如果进行数值运算,有这么几种方法 方法一: declare -i sum sum=+ echo $sum 方法二: sum=$ ...

  6. python之random随机函数

    random.random()用于生成 用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限.如果a > b,则生成随机数 1 n: a <= n <= b.如果 ...

  7. 第三周syh

    第三周作业   7-1 判断上三角矩阵 (15 分) 上三角矩阵指主对角线以下的元素都为0的矩阵:主对角线为从矩阵的左上角至右下角的连线. 本题要求编写程序,判断一个给定的方阵是否上三角矩阵. 输入格 ...

  8. phpmyadmin普通用户使用配置

    正常情况需求是,普通用户可以管理特定的数据库,可能也需要能新建数据库,配置如下: 1.添加用户,phpmyadmin和应用访问,所以主机设置127.0.0.1访问即可 2.如果只管理一个数据,可以选择 ...

  9. zabbix 内网监控云服务器

    今天 搞监控碰到了一个问题就是.内网机器搭建的zabbix服务器去监控云服务器agent的时候,agent 需要写服务端的IP地址. 我的思路是内网服务器映射自己公网IP地址的zabbix的端口100 ...

  10. DNS 搜索 - dig 命令

    dig 命令_互动百科 示例: # 全部 dig www.zjffun.com # 只显示 ANSWER SECTION dig www.zjffun.com +noall +answer