一文读懂异步和同步——async/await在运行时和普通代码的执行顺序的问题

文章探讨了JavaScript中的await关键字如何与async函数一起用于等待Promise对象的结果,以及程序执行顺序,特别是异步操作如何被放入事件循环中。当遇到await时,程序会暂停直到Promise完成,但不会阻塞同步代码的执行。此外,文章还解释了宏任务和微任务的区别,以及它们在执行顺序中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、执行顺序问题

JavaScript中的await语句是异步编程中用于等待Promise对象执行结果的关键字,它通常与async函数一起使用。在使用await关键字时,程序的执行将暂停,直到该关键字后面的Promise对象完成执行并返回结果。

函数代码执行顺序通常情况下按照代码所在文件从上至下的顺序执行,在执行到遇到异步操作时,会将该异步操作放入事件循环中,继续执行下面的同步代码,等异步操作结束后再执行回调函数或执行then方法所传入的回调函数。

JavaScript中的await语句是异步编程中用于等待Promise对象执行结果的关键字,它通常与async函数一起使用。在使用await关键字时,程序的执行将暂停,直到该关键字后面的Promise对象完成执行并返回结果。

函数代码执行顺序通常情况下按照代码所在文件从上至下的顺序执行,在执行到遇到异步操作时,会将该异步操作放入事件循环中,继续执行下面的同步代码,等异步操作结束后再执行回调函数或执行then方法所传入的回调函数。

举个例子:

async function test() {
   console.log("start...")
   await fetch('https://myapi.com/data') // 网络请求,会阻塞当前线程
   console.log("end...")
}
test()
console.log("other code...")

执行结果为:

start...
other code...
end...

在代码执行过程中,先输出了"start..."和"other code...",说明异步代码的执行并没有阻塞其他同步代码的运行。直到异步代码中的网络请求完成之后,才会执行await之后的代码,输出"end..."。

需要注意的是,await只能在async函数中使用,而且如果await后面的Promise对象被reject了,那么await将抛出异常,因此建议在使用await时需要添加try-catch语句来处理异常情况。

再举个例子:

 

再看一道经典面试题: 

 

执行顺序为ADCB  而不是 ADBC  为什么: 

首先因为两个语句都是宏任务,没有微任务,所以两个优先级看起来是一样的,但是因为C的回调函数的延时时间为0因此其会作为异步任务(耗时任务)的第一个执行对象!!

二、JS任务详解

同步任务就是普通的代码 非耗时任务  

异步任务则还分为两种:


 

其中宏任务里往往很多都是用微任务代码写的        

 每次执行完一个宏任务都会判断有没有微任务待执行,如果有,那么就先执行微任务再继续下一个宏任务

 

又一道经典面试题:

 一开始看可能会觉得和上面那道面试题冲突了,其实不然 ,

因为我们要搞清楚thenFs.readFile().then()是宏任务还是微任务,结果其实我们理想的不一样,他和Promise().then()不一样,Promise().then()是微任务,而thenFs.readFile().then()是宏任务!!!

因此前面的面试题:

 

的执行结果为ADCB 而不是ADBC  因为他们两都是宏任务,又因为setTimeout的timeout为0 所以就先执行thenFs.then()了!!!

Vue中使用asyncawait,可以通过在方法前面加上async关键字来定义异步函数,然后在需要等待的地方使用await关键字等待异步操作的结果。例如,可以在Vue组件的方法中使用asyncawait来处理异步请求。 引用\[1\]中的示例代码展示了在Vue中使用asyncawait的基本用法。可以定义一个异步函数,使用await关键字等待axios.get方法返回的Promise对象的结果。然后可以在异步函数外部使用.then方法来处理异步操作的结果。 引用\[2\]中提到,async/await是一种编写异步代码的新方法,它建立在Promise的基础上,让异步代码看起来更像同步代码。它的使用场景包括处理异步请求、处理定器、处理文件读写等。 总结起来,在Vue中使用asyncawait可以更方便地处理异步操作,使代码更加清晰易读。可以在Vue组件的方法中使用async关键字定义异步函数,然后使用await关键字等待异步操作的结果。这样可以避免回调地狱,使代码更加简洁易于维护。 #### 引用[.reference_title] - *1* [Vue接口调用(三)async/await用法](https://blog.csdn.net/m0_55990909/article/details/123981292)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [vue中使用asyncawait(一文教会你)](https://blog.csdn.net/m0_52040370/article/details/124660219)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Vueasyncawait的使用](https://blog.csdn.net/m0_58974838/article/details/117636647)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值