为什么会先输出异步函数里的代码,而不是先输出异步外的代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .ad { display: block; width: 300px; height: 150px; margin: 0 auto; } .none { display: none; } </style> </head> <body> <img id="ad" src="https://img1.sycdn.imooc.com/climg//6264ff5c0916217006960344-360-202.png" alt="前端体系课" class="ad none"> <script> // 等待异步操作 // await跟一个异步操作,其实异步操作就是Promise对象。它们会共同构成一个表达式,有值! // async的机制:async函数中的代码有先后关系,await会阻塞该async函数中代码的执行,async函数外的代码不受影响。async函数内部是同步执行的,它本身是异步的。所以会先输出"async外的代码" // async函数内部是同步执行的,外部是异步的。先输出最后的输出 function wait(ms) { return new Promise(resolve => { setTimeout(resolve, ms); }) } async function ad() { // 疑问处:视频里老师说ad函数是异步的,在整体下,也会先输出异步函数外边的,再输出异步函数里的。这里为什么会先输出了"async内的代码"呢? console.log("async内的代码"); const $ad = document.getElementById("ad"); // await后面的wait函数 返回是Promise对象 await wait(1000); // 程序堵塞住,等待1s,等待完显示广告 $ad.classList.remove("none"); await wait(2000); // 程序堵塞住,等待2s,等待完隐藏广告 $ad.classList.add("none"); } ad(); console.log("async外的代码"); // ————————————————————————————————————————————————————————— // 上边那四行代码,等价于下边的: // wait(1000).then(() => { // $ad.classList.remove("none"); // return wait(2000); // }).then(() => { // $ad.classList.add("none"); // }) </script> </body> </html>
视频里老师说ad函数是异步的,在整体下,也会先输出异步函数外边的,再输出异步函数里的。这里为什么会先输出了"async内的代码"呢?
29
收起
正在回答
1回答
同学你好,不是这样理解的,我们可以看一个简单的小例子,如下代码:
打印结果为:
可以看到:async函数timeout调用了,但是没有任何输出,我们打印一下这个timeout()语句;改成console.log(timeout()),参考如下:
可以看出,async函数返回值为promise对象,如果要获取到promise返回值,应该用then方法
由此可以看出,先执行的同步然后执行的异步;
同学可以再试着重新理解理解;
祝学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星