JAVAEE第四周
一、定义
Async函数是Generator函数的语法糖,但相较来说比Generator函数更强大一些。主要用于1解决一次异步调用异步函数的问题,即当第一个异步调用结束后,再调用第二个异步函数;等第二个调用完成后再调用第三个的这种情况。在以往的写法里,需要进行回掉函数多层嵌套才能实现,但这种写法会导致多层回调函数嵌套,既不方便维护,也不方便解决。而新的写法可以解决以上的这些问题,将其变成类似同步函数一样的写法,从而能够极大的减轻代码的复杂度。
二、函数示例
使用Generator函数实现依次读取两个文件,代码如下:

写成async函数,就应该是下面这样:

一比较就会发现,async函数就是将Generator函数的星号(*)替换成async,将yield替换成await而已。
三、Async函数的优点
通过比较Async函数和Generator函数的区别,可以明显发现,前者对后者的改进,体现在以下三点:
(1)内置执行器。Generator函数的执行必须依靠执行器,所以才有了co函数,而async函数自带执行器。也就是说,async函数的执行,与普通函数一模一样,只要一行:var result = asyncReadFile();
(2)更好的语义。async和await,比起星号和yield,语义更清楚了。async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果。
(3)更广的适用性。co函数库约定,yield命令后面只能是Thunk函数或Promise对象,而async函数的await命令后面,可以跟Promise对象和原始类型的值(数值,字符串和布尔值,但这时等同于同步操作)。
四、Async函数的几种写法
这里的写法不是函数内的写法,而是函数本身的写法:
①函数声明(声明式):async在function前
async function foo() {
// some code...
}
②函数表达式(赋值式):async在function前
let foo = async function () {
// some code...
}
③对象属性(属性式):async在function前
let foo = {
bar: async function () {
// some code...
}
}
④对象属性简写:async在函数名前
let foo = {
async bar () {
// some code...
}
}
⑤箭头函数:
let foo = async () => {
// some code...
}
⑥Class写法:记得先new一个实例才能用
class Foo {
async bar() {
// some code...
}
}
五、Async函数的实现
async函数的实现,就是将Generator函数和自动执行器包装在一个函数里。

所有的async函数都可以写成上面的第二种形式,其中的spawn函数就是自动执行器。下面是spawn函数的实现,基本就是前文自动执行器的翻版。

六、Async函数的用法
同Generator函数一样,async函数返回一个Promise对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。下面是一个例子:

上面代码是一个获取报价的函数,函数前面的async关键字,表明该函数内部有异步操作,调用该函数时,会立即返回一个Promise函数。
七、补充说明
1、隐式转换:当await后面跟的不是Promise对象,而是基本类型时,该值会被await通过Promise.resolve隐式转换。事实上,可以被转换的包括例如Boolean、String、Number、对象、数组等,甚至可以支持自定义类型。
2、await函数的限制:await所在的位置只能是async函数的直接所在位置,而不能是async函数外,或者是async函数内部的函数
3、返回值的状态变化:async函数的返回值,是一个Promise对象,即有pending、resolved、rejected三种状态,当函数执行完毕的时候。pending状态变化。
JAVAEE第四周的更多相关文章
- javaee 第四周作业
分析hello.java.下载链接:https://github.com/javaee/tutorial-examples/tree/master/web/jsf/hello1 /** * Copyr ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- javaEE设计模式——门面模式
1.本节内容 门面模式的意图介绍 门面模式带来的好处 门面模式的应用场景 实现模式的3中方式:POJO.无状态与有状态回话Bean门面 有状态与无状态回话Bean门面的重要差别 关于门面模式使用的警告 ...
- 【解决方案】cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'. One of '{"http://java.sun.com/xml/ns/javaee":run-as, "http://java.sun.com/xml/ns/javaee":security-role-r
[JAVA错误] cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'. One o ...
- [JavaEE笔记]Cookie
引言 由于 Http 是一种无状态的协议,服务器单从网络连接上无从知道客户身份. 会话跟踪是 Web 程序中常用的技术,用来跟踪用户的整个会话.常用会话跟踪技术是 Cookie 与 Session. ...
- 纯css3圆形从中心向四周扩散动画效果
查看效果:http://hovertree.com/texiao/css3/37/ 先来个简单的示例,例如: @keyframes hovertreemove{from {top:30px;}to { ...
- JavaEE开发基础
1 JavaEE简介 Java平台有三个版本,分别是JavaSE(Java Platform, Standard Edition),JavaEE(Java Platform, Enterprise E ...
- javaEE基础08
javaEE基础08 一.继承 特点:继承父类的属性和方法,单继承(多继承) 特性:方法的复写(重写) 比如:人可以养狗 人------>狗:整体和部分(拥有)关系 关键字:extends 结构 ...
- JavaEE:JavaEE技术组成
Java平台版本: JavaSE:Java Platform Standard Edition,标准版,用来开发桌面应用系统: JavaEE:Java Plateform Enterprise Edi ...
随机推荐
- 常用sql语句总结(二)(更新数据,序列,创建数据表,约束,注释)
常用sql语句总结(二)(更新数据,序列,创建数据表,约束,注释) 一. 增 INSERT INTO 数据表(字段,字段,-) VALUES(值,值-); INSERT INTO emp(empno, ...
- HDU 4417 Super Mario(主席树 区间不超过k的个数)题解
题意:问区间内不超过k的个数 思路:显然主席树,把所有的值离散化一下,然后主席树求一下小于等于k有几个就行.注意,他给你的k不一定包含在数组里,所以问题中的询问一起离散化. 代码: #include& ...
- [math]本博客已经支持书写数学公式
本博客已经支持mathjax格式公式 使用方法 使用方法单美元符号加单行公式. 使用方法双美元符号加多行公式. 展示 单行公式:\(x^2+2x+1=0\) 多行公式:\[x=\frac{{-b}\p ...
- J2EE笔记
J2EE的优势 J2EE允许公司把一些通用的.很繁琐的服务端任务交给中间件供应商去完成.这样开发人员可以集中精力在如何创建商业逻辑上,相应地缩短了开发时间.高级中间件供应商提供以下这些复杂的中间件服务 ...
- MySQL卸载安装8.0.*
一.卸载 1. 本人安装目录在C盘Program Files文件中(删除MySQL文件夹) 2. 找到C盘Program Data隐藏文件夹中的MySQL并删除(删除提示MySQL在运行的话可以去任务 ...
- python多环境下虚拟环境的搭建和使用
由于开发环境要求,或者实际需要.经常会出现python2.7和python3.x共存下的开发环境问题.虚拟环境的搭建可以很好的隔离Projects的开发环境. 1.首先解决python2.7和pyth ...
- mybatis-generator自动生成Mapper.dao.entity
在pom.xml中添加依赖 <plugin> <groupId>org.mybatis.generator</groupId> <artifactId> ...
- Matlab - 各种函数学习
一.find函数 (1)find()函数的基本功能是返回向量或者矩阵中不为0的元素的位置索引. X = [1 0 4 -3 0 0 0 8 6]; index = find(X) 返回不为零的位置索引 ...
- CentOS6.5利用Docker部署ShowDoc
在Docker中部署ShowDoc 一.安装Docker 1.安装Docker yum install docker 最后出现Complete即可 2.启动服务 # service docker st ...
- OSGI框架
面向Java的动态模型系统 OSGi服务平台提供在多种网络设备上无需重启的动态改变构造的功能.为了最小化耦合度和促使这些耦合度可管理,OSGi技术提供一种面向服务的架构,它能使这些组件动态地发现对方. ...