问题:解决异步回调的深层嵌套的问题.(回调地狱)
promise
对象用于表示一个异步操做的最终状态,promise
在回调代码和将要执行这个任务的异步代码之间提供了一种可靠的中间机制来管理回调。数组
//构造函数,回调函数是同步的回调 new Promise(function(resolve,reject){ ....//异步操做 })
Promise的实例对象有三个状态promise
resolve和reject分别是两个函数,当在回调中调用时,会改变promise实例的状态,resolve改变状态为成功,reject为失败.异步
thenasync
Promise.prototype.then()
当promise对象的状态发生改变时,绑定在其身上的then方法就会被调用。
then方法包含两个参数:onfulfilled函数 和 onrejected函数,它们都是 Function
类型。当Promise状态为fulfilled时,调用 then 的 onfulfilled 方法,当Promise状态为rejected时,调用 then 的 onrejected 方法, 因此在异步操做的完成和绑定处理方法之间不存在竞争,then() 方法返回一个 Promise对象.函数
返回值编码
then方法返回一个新的Promise,而它的行为与then中的回调函数的返回值有关:prototype
catchcode
catch() 方法返回一个Promise,而且处理拒绝的状况。对象
Promise.prototype.catch()
事实上,catch方法至关于then方法的第二个参数方法,触发拒绝状态.get
注意,
若是调用 then的 Promise 的状态(fulfillment 或 rejection)发生改变,可是 then 中并无关于这种状态的回调函数,那么 then 将建立一个没有通过回调函数处理的新 Promise 对象,这个新 Promise 只是简单地接受调用这个 then 的原 Promise 的终态做为它的终态。因此在链式上,最终会执行到catch上.
//链式示例 new Promise(function (resolve, reject) { setTimeout(function () { console.log("1"); resolve(); }, 1000); }).then(function () { return new Promise(function (resolve, reject) { setTimeout(function () { console.log("2"); // resolve(); reject(); }, 1000); }); }).then(function () { return new Promise(function (resolve, reject) { setTimeout(function () { console.log("3"); resolve(); }, 1000); }); }).then(function () { return new Promise(function (resolve, reject) { setTimeout(function () { console.log("4"); resolve(); }, 1000); }); }).catch(function(){ console.log("catch"); })
symbol
新的一种基础数据类型symbol,表示独一无二的值.
它一般做为对象的属性键,内置对象广泛存在该值.
// 通常用法,它并非构造器,不能经过new,会报错. let sym = Symbol(); // 在对象中表现形式,要用[]包裹,否则会被认为是string. var obj = { [Symbol()]:"value"; }
该属性是匿名,因此不可枚举,只能经过.getOwnPropertySymbols()返回的数组.
// 想要得到两个相同的Symbol,得经过.for() Symbol("asd") === Symbol("asd") // false Symbol.for("asd") === Symbol.for("asd") // true
Iterator
迭代器,存在于特定几种可枚举的数据类型中.
// 通常用如下这种形式的键保存了迭代器函数. // arr[Symbol.iterator] aarr[Symbol.iterator]( ).next( ) //遍历下一个,返回value和done,value表示值,done表示是否能够继续遍历下一个. //for...of循环遍历就是基于此,必须该数据类型有迭代器.
回到generator
//表现形式 function* test(){ yield 1; //任务1 yield 2; //任务2 yield 3; //任务3 yield 4 ; //任务4 } // 调用该方法会返回一个含有迭代对象的对象. var obj = text(); obj.next(); //调用该方法时,每次到一个yield处中止.
做用:
async function test (){ // 等待状态改变,自动执行到下一个wait处 var flag = await new Promise((resolve,reject)=>{ setTimeout(function(){ // 状态改变 resolve(data); //这里面的值传递给flag },1000) }) //经过flag传递数据 flag = await new Promise((resolve,reject)=>{ setTimeout(function(flag){ // 状态改变 resolve(flag); },1000,flag) }) } test().catch(function(err){ //处理异常 });