ES6_基础_03

一、异步编程Generator函数

1.基础特征:
Funciton关键字和函数名之间有个*;
内部用yield表达式定义不同的内部状态,且返回yield后面的表达式值作为value,注意是使用next()方法返回的遍历器对象value值,如{value:123,done:false},而yield本身是undefined。
在这里插入图片描述

1.1其中yield必须放在Generator函数里面;
1.2yield表达式如果用在另一个表达式之中,必须放在圆括号里面,如:(yield) || (yield 456)
1.3yield表达式用作函数参数或放在赋值表达式的右边,可以不加括号
执行 Generator 函数会返回一个遍历器对象,且必须使用.next()来访问下一个状态(这里需要注意是执行Generator函数后返回一个遍历器对象,然后才next()开始游动)。如下图:
在这里插入图片描述
在这里插入图片描述
2.Next方法 :
next方法可以带一个参数,该参数就会被当作上一个yield表达式的返回值。将yield表达式替换成一个值
在这里插入图片描述

3.Throw方法:将yield表达式替换成一个throw语句
有一个throw方法,可以在函数体外抛出错误,然后在 Generator 函数体内捕获,throw方法可以接受一个参数,该参数会被catch语句接收,建议抛出Error对象的实例。如:.throw(new Error(‘有问题!’)),可以配合Generator函数内部try…catch…来抛出错误,若内部函数没有try…catch…,则可以在函数外部设置try…catch…

4.Return方法:将yield表达式替换成一个return语句
有一个return方法,可以返回给定的值,并且终结遍历 Generator 函数。
如果 Generator 函数内部有try…finally代码块,且正在执行try代码块,那么return方法会推迟到finally代码块执行完再执行。
调用return方法后,就开始执行finally代码块,然后等到finally代码块执行完,再执行return方法。

5.Yield*:
如果yield表达式后面跟的是一个遍历器对象,需要在yield表达式后面加上星号,表明它返回的是一个遍历器对象。这被称为yield表达式。如果在 Generator 函数内部,调用另一个 Generator 函数,就需要使用yield

6.结合ajax异步请求应用场景
Function * getData(){
Var response = yield ajax(‘http://xxxxxx’);
Var result = JSON.parse(response);
}
Function ajax(url){
makeAjax(url,function(res){
My.next(res)
})
}
Var My = getData();
My.next();

7.Generator函数的异步应用(主要是解决自动执行Generator函数的异步操作)
7.1 Thunk 函数
7.2 co模块

二、ES8(ES2017)的async函数

1.与ES6的Generator函数形式上区别:
1.1将 * 换成了 async
1.2将 yield 换成了 await
let m = async function(){
const a1 = await xxx;
const a2 = await yyy;
}

2.对Generator函数的改进:
2.1 内置自动执行器(在Generator中我们需要使用next()方法来执行每一个yield)
2.2 返回Promise可链式操作(在ES6中我们需要用Thunk()函数和co模块来实现)

3.用法:
3.1 async函数内部return语句返回的值,会成为then方法回调函数的参数。
3.2 正常情况下,await命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值。
3.3 await命令后面的Promise对象,运行结果可能是rejected,所以最好把await命令放在try…catch代码块中。

4.异步遍历器:
4.1 异步遍历的接口
4.2 for await of
4.3 异步的Generator函数

三、Class

Es5:写法
Function x(){
This.name = “1”
This.sex = “2”
}
X.prototype.y = function(){
Return this.name + ‘-’ +this.sex
}
Es6:写法
Class x(){
Construct(name,sex){
This.name = name;
This.sex = sex;
}

Y(){
Return this.name + ‘-’ +this.sex
}
}

8.在“类”的内部可以使用get和set关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。

9.所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。

10.继承 extends
接上面x类
Class z extends X(){

Constructor(name,sex,age){
Super(name,sex)
This.age = age
}

w(){
Return this.age + super.Y()
}
}
子类必须在constructor方法中调用super方法
ES6 的继承机制完全不同,实质是先将父类实例对象的属性和方法,加到this上面(所以必须先调用super方法),然后再用子类的构造函数修改this。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值