ECMAScript 6
-
Promise对象
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。- 基本用法
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
const promise = new Promise(function (resolve, reject) { setTimeout(function (){ console.log("数据"); //这里相当后台返回的数据 resolve("数据"); },1000); if (true) { resolve("数据"); } else { reject("失败"); } }); //在外边获取异步数据 promise.then(function (res) { //成功 console.log(res); }, function (error) { console.log(error); });
- 一个promise只能写一个请求
let promise=new Promise(function (resolve,reject){ try{ if(false) { setTimeout(resolve,100,1); } else{ throw new Error("数据请求异常!"); } } catch(err){ reject(err); } }); promise.then(function (res){ console.log(res); }).catch(function (err){ console.log(err); });
- promise对象的执行顺序
let data=null; let promise=new Promise(function (resolve,reject){ console.log("start"); setTimeout(resolve,1000,"数据") }); console.log("外部"); promise.then(function (res){ console.log(res); data=res; }); console.log("end"); console.log(data);
- 异步加载图片
let promise = new Promise(function (resolve, reject) { let img = new Image(); img.onload = function () { setTimeout(resolve,1000,img); }; img.onerror = function () { reject(new Error("图片加载失败!")); } img.src = "./img/baidu.png"; }); promise.then(function (res) { console.log(res); }).catch(function (err) { console.log(err); });
- Promise对象实现 Ajax 操作
const post = function (url, data) { const promise = new Promise(function (resolve, reject) { let http = new XMLHttpRequest(); let handle = function () { if (http.readyState != 4) { return; } if (http.status == 200) { resolve(http.response); } else { reject(new Error("请求数据失败!")); } } http.open("post", url); http.onreadystatechange = handle; http.responseType = "json"; if (data) { http.send(data); } else { http.send(); } }); return promise; } post("./data/stu.json").then(function (res){ console.log(res); }).catch(function(err){ console.log(err); });
- 多个promise进行连用
const promise1=new Promise(function (resolve,reject){ setTimeout(resolve,10000,"加载数据10秒") }) const promise2=new Promise(function (resolve,reject){ setTimeout(resolve,1000,promise1); }) promise2.then(function (res){ console.log(res); }); console.log(Promise.prototype);
- Promise.all()—多个promise合并
const p1 = new Promise(function (resolve, reject) { setTimeout(resolve, 1000, "学生"); }); // p3 p4 是一个新的promise 没有promiseValue let p3=p1.then(function (res){ return res; }); const p2 = new Promise(function (resolve, reject) { setTimeout(resolve, 1000, "老师"); }); let p4=p2.then(function (res){ return res; }); console.log(p3,p4); //合并 const p5 = Promise.all([p1, p2]).then(function (res) { console.log(res); }).catch(function (err) { console.log(err); });
- 基本用法
-
async 函数
1)内置执行器。
Generator 函数的执行必须靠执行器,所以才有了co模块,而async函数自带执行器。也就是说,async函数的执行,与普通函数一模一样,只要一行。
(2)更好的语义。
async和await,比起星号和yield,语义更清楚了。async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果。
(3)更广的适用性。
co模块约定,yield命令后面只能是 Thunk 函数或 Promise 对象,而async函数的await命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved 的 Promise 对象)。
(4)返回值是 Promise。
async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你可以用then方法指定下一步的操作。
进一步说,async函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而await命令就是内部then命令的语法糖。- 基本用法
function getName(){ const promise=new Promise(function (resolve,reject){ try{ setTimeout(resolve,500,"张三"); } catch(err){ reject(err) } }); return promise; } function getSex(){ const promise=new Promise(function (resolve,reject){ try{ setTimeout(resolve,1000,"男"); } catch(err){ reject(err) } }); return promise; } //async 异步函数返回值为promise对象 then catch finally async function getinfo(){ const name= await getName(); const sex=await getSex(); return { name:name, sex:sex }; } console.log(getinfo()); getinfo().then(function (res){ console.log(res); });
- await 等待promise执行完在继续执行
function gettime(ms){ return new Promise(function (resolve){ setTimeout(resolve,ms); }); } async function times(val,ms){ await gettime(ms); console.log(val); } times("输出",1000); //异步函数的编写形式 async function getTage(){} const getData=async ()=>{} let obj={async getsex(){}};
- await 命令后边必须是promise
async function getlocal(){ const number=await new Promise(function (resolve,reject){ try{ setTimeout(resolve,1000,1); } catch(err){ reject(err); } }) console.log(number); return number; } getlocal();
- await 错误处理
async function getlocal(){ let number=null; try{ number=await new Promise(function (resolve,reject){ try{ setTimeout(resolve,1000,1); } catch(err){ reject(err); } }) } catch(err){ throw err.message; } return number; } getlocal().then(function (res){ console.log(res); });
- 所有的等待抓异常
async function getlocal(){ try{ let number=await new Promise(function (resolve,reject){ try{ setTimeout(resolve,1000,1); } catch(err){ reject(err); } }) let data=await new Promise(function (resolve,reject){ try{ setTimeout(resolve,2000,"学生信息"); } catch(err){ reject(err); } }) return { number:number, data:data }; } catch(err){ console.log(err); } } getlocal().then(function (res){ console.log(res); });
注释:如果await后边的promise返回rejected,直接抓异常抓整个await
- 按顺序完成异步操作
//如果他们之间没有关系可以同时触发 function getname(){ return new Promise(function (resolve){ setTimeout(resolve,1000,"张三"); }) } function getsex(){ return new Promise(function (resolve){ setTimeout(resolve,1000,"男"); }) } function getage(){ return new Promise(function (resolve){ setTimeout(resolve,1000,"18"); }) } async function getinfo(){ let data=await Promise.all([getname(),getsex(),getage()]); return data; } getinfo().then(function (res){ console.log(res); }); //如果多个await之间有继发关系,就让他们一个一个走 function getname(){ return new Promise(function (resolve){ setTimeout(resolve,1000,"张三"); }) } function getsex(name){ return new Promise(function (resolve){ setTimeout(resolve,1000,"男"); }) } function getage(age){ return new Promise(function (resolve){ setTimeout(resolve,1000,"18"); }) } async function getinfo(){ let name=await getname(); let age=await getage(name); let sex=await getage(age); return sex; } getinfo().then(function (res){ console.log(res); });
-
class 基本语法
- 基本用法
class Student{ //声明构造函数 一般在类被实例化的时候直接调用构造函数 //构造函数分为有参构造和无参构造 constructor(){ this.name=null; this.sex=null; } toString(){ console.log("...."); } /*下面方法类似java里面get set 访问器*/ getName(){ return this.name; } setName(val){ this.name=val; } } let stu=new Student(); stu.setName("张三"); console.log(stu.getName()); console.log(typeof Student);
注释:类上的成员方法在类的prototype 上面,属性直接在对象上
- 类的实例
//如果类已经写好 在去加方法 所有的方法在类的原型上 所以添加时使用 Object.assign(Student.prototype,{ toValue(){ }, toGetLocal(){ } }) console.log(stu); //Object.getOwnPropertyNames 获取类对象上原型的所有方法名称 集合型 console.log(Object.getOwnPropertyNames(Student.prototype)); //类里面的构造函数可写或不写 不写默认添加一个构造函数 class Animal{ } let cat=new Animal(); console.log(cat); //声明类 写一个有参构造 class Position{ constructor(x=0,y=0){ this.x=x; this.y=y; } alert(){ console.log(`坐标:${this.x},${this.y}`); } } let pot=new Position(144,97); console.log(pot); pot.alert(); //Position.hasOwnProperty() 检测原型上有没有什么名称 true //检测原型方法在原型链上找 //属性可以直接检测 console.log(pot.__proto__.hasOwnProperty("alert")); console.log(pot.hasOwnProperty("x"));
- 静态方法
//es6里面的 取值函数(getter)和存值函数(setter) //拦截该属性的存取行为。 // get set 名称和属性名一致会死循环 //名称不一致 let getinfo="GetName"; class Person{ constructor(){ } get _name(){ console.log(2); return this.name; } set _name(value){ console.log(1); this.name=value; } //类表达式 以表达式方式解析名称 [getinfo](){ console.log(3); } static getlist(){ console.log("静态方法"); } } let sren=new Person(); sren._name="张三"; console.log(sren); console.log(sren._name);
注释:公开方法可以通过类对象来点;静态方法通过类名称来点;静态字段用类名称来点;静态对象不是市里对象上的属性;
-
class 继承
Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多。
class Person {
constructor(n, s) {
this.name = n;
this.sex = s;
}
eat() {
console.log("吃饭");
}
static work() {
console.log("....");
}
}
class Children extends Person {
constructor(m, n, s) {
super(n, s)
this.money = m;
}
}
class Student extends Children {
constructor(n, s) {
super("钱", n, s);//调用父类的构造函数
}
job() {
console.log("上学");
}
}
let s = new Student();
console.log(s);
注释:es6可以实现多继承,也就是继承叠加