js: async-await
async是一种用同步的方式编写异步代码的方法,与promise一样也是非阻塞的。
返回值:
async的返回值是一个promise对象。
执行顺序:
async的异步指的是async函数后面的代码是异步的,但async里面还是同步的,但需要注意的是,这里的同步不是说await后面的函数没执行完就不往下执行(指async里面的await后面的代码),而是,当调用async函数,程序执行到await时,1.会先去执行一遍await里面的代码,2.再回到调用async函数后面继续执行,3.完了之后再回到async里面的await后面继续执行。前面说的执行一遍不是说全部执行完毕,await后面的函数里如果有一个定时器(5s),那么,程序并不会等待5s后再执行步骤1,而是执行定时器的时候,异步去执行步骤1后面的。
来看两个例子:
1.如果await后面的函数的返回值是一个直接值,或者没有返回值的普通函数。
<script> function sleep(sec) { console.log('执行1'); setTimeout(function () { console.log('执行2'); }, sec * 1000) } async function show() { console.log('start...'); let res = await sleep(5); console.log('执行3'); } show(); console.log('执行4'); console.log('执行5'); </script>
输出结果:
//start...
//执行1
//执行4
//执行5
//执行3
//执行2
2.如果await后面返回的是一个promise对象。
function sleep(sec) { console.log('执行1'); return new Promise(function (resolve, reject) { setTimeout(function () { resolve('aaa');//如果不执行resolve,程序不会继续往下执行 console.log('执行2'); }, sec * 1000) }) } async function show() { console.log('start...'); let res = await sleep(5); // console.log(res); console.log('执行3'); } show(); console.log('执行4'); console.log('执行5');
输出结果:
//start...
//执行1
//执行4
//执行5
//执行2
//执行3
解释:当程序执行到await时,会先去执行sleep里面代码,输出“执行1”,并将返回的promise对象放入promise队列中,再去执行show()后面的代码,输出“执行4”,"执行5",然后再回到async里等待await的返回值,再继续await后面的代码。