JS Generator 函数的含义与用法实例总结


Posted in Javascript onApril 08, 2020

本文实例讲述了JS Generator 函数的含义与用法。分享给大家供大家参考,具体如下:

读阮一峰老师《Generator 函数的含义与用法》总结

老师的文章通俗易懂,但是我个人理解上面有一些差,所以看了几遍之后才有呢么一点点体会

把它记录下来。

还是那句话,所有事物的出现都是为了解决对应的问题。

那么Generator出现是为了解决什么问题的呢?

在异步编程的场景下,如果有多个异步任务,如何处理他们的先后执行顺序?

举一个常见的例子,jquery的ajax请求,每一个success都是一个异步任务。

那么问题来了,如果我要保证页面渲染要在5个网络请求都回来之后再去渲染页面。

我们的代码就会变成:

$.ajax({...success:function(data){
  $.ajax({...success:function(data){
    $.ajax({...success:function(data){
      $.ajax({...success:function(data){
        $.ajax({...success:function(data){
          //do something
        }})
      }})
    }})
  }})
}})

这就是”回调函数噩梦”(callback hell)

为了解决这个问题,后来出现了Deferred和promise

两者区别不大,通过一种包装写法来减少回调函数

上面的ajax就可以写成:

ajax1 = $.ajax({...success:function(data){});
ajax2 = $.ajax({...success:function(data){});
ajax3 = $.ajax({...success:function(data){});
ajax4 = $.ajax({...success:function(data){});
ajax5 = $.ajax({...success:function(data){});
$.when(ajax1,ajax2,ajax3,ajax4,ajax5).done(function(
  //do something
)).then(function(){
  //do something2
})

1.8版本以上的jquery ajax模块默认返回Deferred对象

Deferred和promise将回调函数做拆分,将异步任务的处理和执行分成两部分完成

他们最大的问题就是代码冗余,包装之后的代码都需要通过then,done来执行后面的内容,也导致层次感不清晰

那有没有一种比较无感,简单的写法呢?

那就是协程,
我之前也是在这个地方困惑了很久,
前面说的大多日常用到过,也清楚一些原理,
关于协程用到的就少了,我们来分析下吧。

直接看一下协程的例子:

function asnycJob() {
 // ...其他代码
 var f = yield readFile(fileA);
 // ...其他代码
}

阮一峰老师的原话:

上面代码的函数 asyncJob 是一个协程,它的奥妙就在其中的 yield 命令。它表示执行到此处,执行权将交给其他协程。也就是说,yield命令是异步两个阶段的分界线。 协程遇到 yield 命令就暂停,等到执行权返回,再从暂停的地方继续往后执行。它的最大优点,就是代码的写法非常像同步操作,如果去除yield命令,简直一模一样。

之前没理解的原因就是没好好读这两句话,今认真看了一下,茅塞顿开。重要的有这么几点

首先asnycJob这个方法就是一个协程

yield相当于return,会返回当前程序的执行状态

当执行到yield,程序挂起等待返回后继续执行。

挂起这段时间去执行其他协程函数

Generator函数是ES6对协程函数的实现,

Generator函数的特点就是可以暂停代码执行。

跟协程函数一样,遇到yield关键字就暂停代码执行,

跟普通函数的区别在于Generator函数不会反悔结果,而是返回指针对象,

通过指针的next方法移动指针指向下一个yield关键字位置。

也就是说Generator函数的分阶段执行是由next方法控制的。

使用了Generator函数之后会对我们的代码有多大的改变呢?

fangction* gen(){
  var url = 'user/get/info';
  var data = yield $.get({url:url});
  console.log(data.userName);
}

你不需要担心远程接口的返回时机,完全按照同步的方式写代码就行。

但是也有缺点,Generator函数把一步操作做的很简洁,但对流程的管理却不方便,

上面的例子如何执行?

var g = gen();
g.next();
g.next();

next 方法的作用是分阶段执行 Generator 函数。每次调用 next 方法,会返回一个对象,

表示当前阶段的信息( value 属性和 done 属性)。value 属性是 yield 语句后面表达式的值,表示当前阶段的值;

done 属性是一个布尔值,表示 Generator 函数是否执行完毕,即是否还有下一个阶段。

你需要执行两次.next方法,来将你的Generator函数执行完毕。

关于如何自动化异步任务的流程管理,就需要co,thunk,async的帮助了

原文:Generator 函数的含义与用法

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js form action动态修改方法
Nov 04 Javascript
jQuery版Tab标签切换
Mar 16 Javascript
JavaScript执行顺序详细介绍
Dec 04 Javascript
javascript实现获取cookie过期时间的变通方法
Aug 14 Javascript
js闭包实现按秒计数
Apr 23 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
Aug 05 Javascript
微信小程序 生命周期详解
Oct 12 Javascript
深入理解jQuery()方法的构建原理
Dec 05 Javascript
JavaScript实现垂直滚动条效果
Jan 18 Javascript
详解React开发必不可少的eslint配置
Feb 05 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
Sep 17 Javascript
使用pkg打包Node.js应用的方法步骤
Oct 19 Javascript
Vue列表循环从指定下标开始的多种解决方案
Apr 08 #Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
Apr 08 #Javascript
vue开发移动端底部导航条功能
Apr 08 #Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
Apr 08 #Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
Apr 08 #Javascript
JS快速实现简单计算器
Apr 08 #Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
Apr 07 #Javascript
You might like
需要注意的几个PHP漏洞小结
2012/02/05 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
用js实现预览待上传的本地图片
2007/03/15 Javascript
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
2009/05/21 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
JavaScript生成GUID的多种算法小结
2013/08/18 Javascript
用jQuery toggleClass 实现鼠标移上变色
2014/05/14 Javascript
解决js图片加载时出现404的问题
2020/11/30 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
Python实现的生成自我描述脚本分享(很有意思的程序)
2014/07/18 Python
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
python3实现字符串操作的实例代码
2019/04/16 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
酒店门卫岗位职责
2013/12/29 职场文书
中文专业毕业生自荐书范文
2014/01/04 职场文书
银行简历自我评价
2014/02/11 职场文书
公司委托书范本
2014/04/04 职场文书
六年级语文教学反思
2016/03/03 职场文书
800字作文之大雪
2019/12/04 职场文书
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL
利用Apache Common将java对象池化的问题
2022/06/16 Servers