async的意思是异步
await的字面意思是等一下
还是比较形象的,通常来说,作为ES7的语法标准,async一般修饰一个函数,说明这个函数是异步的。await一般是用来执行异步操作的,很多情况下它的后面会跟着Promise对象
async和await提出的意义在于:用同步的方式处理异步!!
定时器是最常见的异步操作,先用它定义一个异步函数。
function sleep(){
setTimeout(()=>{
return 1
},3000)
}
因为await后面跟着的是一个Promise对象。就把它封装一下:
let sleep = () => {
return new Promise((resolve,reject)=>{
setTimeout(() => {
resolve(2);
},3000)
})
}
async function aaa() {
let i = await sleep()
console.log(i);
}
aaa();
最终这样使用出来,3秒之后打印出2。但是如果sleep不用Promise封装,打印的就是undefined。
await可以异步执行一个函数。通常用于执行一个回调函数,await next();
需要注意的地方:除了await后面跟一个Promise,await必须在async定义的函数中使用。
关于async和await的详细说明:
1、无论函数中是否是异步的,async定义的函数的返回值都是promise。
async function getName() {
return 'mapbar_front';
}
console.log(getName());//resolved Promise
上面的这个函数,返回值是一个被注入的Promise对象,注入的值是 ‘mapbar_front’ 这样的一个字符串。
当然,如果上面的函数没有返回值,它的执行结果依然是Promise对象,而且被注入的值是undefined。
2、await可以取得的值是Promise注入的值,而不是Promise。
async function getName() {
return 'mapbar_front';
}
console.log(getName());//resolved Promise
async function doIt() {
const data = await getName();
console.log(data);//mapbar_front
}
doIt();
3、解决了什么问题?
回调函数是前端的一大弊病。
Promise解决了回调函数的层层嵌套的痛楚。
而async和await是基于Promise的语法糖,从使用上来说,更加的清晰简洁。
4、关于async和await的弊病是什么?
弊病一:async语法是ES7的标准,所以会存在兼容性问题。需要使用babel的解析。
弊病二:await必须配合async使用,但是我们想做到,把await得到的值,return出去,这个需求就做不到,一般return出去的值是一个pedding Promise对象。
function step() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(1234)
},1000)
})
}
async function doIt() {
const result = await step();
console.log(result);//1234
return result
}
doIt();//打印出1234
console.log(doIt());//Promise对象