ES7带来了async和await,让js的异步编程更加方便。编程
async和await是Promise的语法糖,让书写更加方便。可是他们是取代不了Promise的。他们是创建在promise机制上的。
简单语法试验:
(1)
正常状况下,能够看出也打印出来一个Promise。其中Promise状态是‘resolved’;promise
(2)
这种状况下,看出Promise状态是'rejected'。并报错,不想报错“红错”,可使用try...catch
(3)
将报错信息catch到。并发
async
async是用来表示函数是异步的,出现async,会返回一个Promise对象,就可使用then方法,方便的添加回调函数了。是语法更加简洁。dom
await
必须出如今async中,不可单独使用;
await后面能够跟任何js表达式,也就是awati能够等不少类型的东西,但主要是等Promise对象被状态被resolved。异步
注意:reject('123'),须要try,catch才能将信息拿出来。
例子:
(1)resolve正常状况下能够拿出。async
(2)reject拿不出
(3)reject须要用try,catch获取信息异步编程
如:函数
function aa(second){spa
return new Promise((resolve,reject) => { setTimeout(() => { resolve('request done'+Math.random()); },second); })
}code
async function bugDemo(){
await aa(1000); await aa(1000); await aa(1000); console.log('clear the loading~');
}
bugDemo();
不阻塞的写法
function aa(second){
return new Promise((resolve,reject) => { setTimeout(() => { console.log('request done'+Math.random()); },second); })
}
async function bugDemo(){
let a =aa(1000); let b =aa(1000); let c =aa(1000); await Promise.all([a,b,c]) console.log('clear the loading~');
}
bugDemo();
注意:await只能在async函数的上下文中。
async function forDemo(){
let arr = [1,2,3,4,5]; for(let i=0;i<arr.length;i++){
await arr[i];
}
}
这个是正常的,不会报错。
async function forBugDemo(){let arr = [1,2,3,4,5];arr.forEach(item => {await item;});}这个会报错