基础概念
- 实际上是generator函数的语法糖
- await只能用在async函数里面,不然会报错
- async函数会返回一个promise对象,而且这个promise对象是执行完resolve的
- await后面
async函数
```async function cc(){
return 111
}
console.log(cc());
//cc()变成了prmose对象,并且执行了resolve()
//因此可以调用then方法
//会把return的参数作为resolve的结果
//从而在then中输出
cc().then(res=>{
console.log(res);//111
})```
await
作用:await其实和generator中的yield关键字一样,但是await后面要是跟promise的话,
只有等到这个promise的状态发生变化之后,才会进行后续的步骤!
function dd1(){ return new Promise((resolve,reject)=>{ setTimeout(resolve,1000) }) } async function dd(){ await dd1() //1只会等到dd1()这个promise 的状态发生变化才会执行 console.log(1); } dd()
同时,await也会返回promise执行的结果
function dd1(){ return new Promise((resolve,reject)=>{ setTimeout(resolve('结果打印'),1000) }) } async function dd(){ let a=await dd1() //同时await会返回promise的resolve执行的结果 console.log(a);//结果打印 } dd()
错误处理
async function cc() {
//用try,catch来捕捉错误
//因为await不能直接返回错误的结果
try { await dd() }
catch (err) {
console.log(err);
}
}
cc()
继发
缺点:是继发性,不能实现像promise.all一样。同步并发,只能一个一个执行,从而造成时间浪费。因此,有些时候还是用all比较好
嵌套
function sleep(duration) {
return new Promise(resolve => {
setTimeout(resolve, duration);
})
}
async function changeColor(color, duration) {
console.log('当前颜色', color);
await sleep(duration);
}
async function main() {
//async函数会自动执行resolve
await changeColor('红色', 2000);
await changeColor('黄色', 1000);
await changeColor('绿色', 3000);
}
main();
面试
- sleep
//实现一个sleep函数,隔1s打印输出1-10
function dd(){
return new Promise((resolve,reject)=>{
setInterval(resolve, 1000);
})
}
async function cc(){
for(var i=0;i<10;i++){
await dd()
console.log(i);
}
}
cc()