1.
| async function Request () { |
| await new Promise(res => { |
| setTimeout(() => { |
| console.log(1) |
| res() |
| }, 1000) |
| }) |
| console.log(4); |
| new Promise(res => { |
| setTimeout(() => { |
| res() |
| console.log(2); |
| |
| }, 1000) |
| }).then(() => console.log(2)) |
| console.log(5); |
| new Promise(res => { |
| setTimeout(() => { |
| console.log(3) |
| res() |
| }, 1000) |
| }).then(() => console.log(3)) |
| |
| } |
| Request() |
| |
| |
| |
2.
| async function Request () { |
| await new Promise(res => { |
| setTimeout(() => { |
| console.log(1) |
| res() |
| }, 1000) |
| }) |
| await new Promise(res => { |
| setTimeout(() => { |
| res() |
| console.log(2); |
| |
| }, 1000) |
| }).then(() => console.log(2)) |
| new Promise(res => { |
| setTimeout(() => { |
| console.log(3) |
| res() |
| }, 1000) |
| }).then(() => console.log(3)) |
| |
| } |
| Request() |
| |
| |
3.
| async function Request () { |
| await new Promise(res => { |
| setTimeout(() => { |
| console.log(1) |
| res() |
| }, 1000) |
| }) |
| await new Promise(res => { |
| setTimeout(() => { |
| res() |
| console.log(2); |
| |
| }, 1000) |
| }).then(() => console.log(2)) |
| await new Promise(res => { |
| setTimeout(() => { |
| console.log(3) |
| res() |
| }, 1000) |
| }).then(() => console.log(3)) |
| |
| } |
| Request() |
| |
| |
同步打印的4,5可以看出函数执行是否被暂停,如果未暂停同步代码会一直执行完,而暂停后会等暂停处,执行完毕才继续执行同步代码
简单来说就是,await会阻塞其后的代码在awit出有结果之后才会继续往后执行.
4. 不同层级嵌套async await
当async进行嵌套之后则可能不会按照自己想要的顺序执行
同层级异步先执行完成,然后是下一层级的异步,依然是按照一个特定顺序
| let request = (data, time = 1000) => |
| new Promise(resolve => { |
| setTimeout(() => { |
| console.log('执行promise', data) |
| resolve(data) |
| }, time) |
| }) |
| let res = '' |
| async function getDetailData() { |
| let resArr = [] |
| ;[(1, 2, 3)].forEach(async key => { |
| res = (await request(key, 1000 + 100 * key)) + 'handle' + key |
| resArr.push(res) |
| }) |
| return resArr |
| } |
| async function getDetailDataNew() { |
| return await new Promise(resolve => { |
| let resArr = [] |
| let idArr = [1, 2, 3] |
| idArr.forEach(async key => { |
| res = (await request(key, 1000 + 100 * key)) + 'handle' + key |
| resArr.push(res) |
| if (resArr.length === idArr.length) { |
| resolve(resArr) |
| } |
| }) |
| }) |
| } |
| async function getDetailDataNew1() { |
| let resArr = [] |
| let idArr = [1, 2, 3] |
| let requestQueue = [] |
| idArr.forEach(key => { |
| requestQueue.push(request(key)) |
| }) |
| return await Promise.all(requestQueue) |
| } |
| let deleteArea = async () => { |
| let resArr = await getDetailData() |
| await request(resArr) |
| } |
| let deleteAreaNew = async () => { |
| let resArr = await getDetailDataNew() |
| console.log(resArr, 'promise 改造后') |
| } |
| let deleteAreaNew1 = async () => { |
| let resArr = await getDetailDataNew1() |
| console.log(resArr, 'promise all 改造后') |
| } |
| deleteArea() |
| setTimeout(() => { |
| deleteAreaNew() |
| }, 1000) |
| setTimeout(() => { |
| deleteAreaNew1() |
| }, 2000) |


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?